我想字符串分割成類似下面的話,所有的串的輸出應該是相同的:拆分SQL字符串成字
輸入:
1. This is a string
2. This is a string
3. This is a string
4. This is a string
OUTPUT:
這是
手段,我要從句子的前三個字,不管空間。
我想字符串分割成類似下面的話,所有的串的輸出應該是相同的:拆分SQL字符串成字
輸入:
1. This is a string
2. This is a string
3. This is a string
4. This is a string
OUTPUT:
這是
手段,我要從句子的前三個字,不管空間。
試試這個:
declare @s1 varchar(3000) ;
declare @xml xml,@str varchar(100),@delimiter varchar(10), @out varchar(max);;
select @delimiter =' '
select @s1 = 'This is a string';
select @s1 = 'This is a string ';
select @s1 = 'This is a string ';
select @s1 = 'This is a string';
select @xml = cast(('<X>'+replace(@s1,@delimiter ,'</X><X>')+'</X>') as xml)
select top 3 @out =
COALESCE(@out + ' ', '') + C.value('.', 'varchar(100)')
from @xml.nodes('X') as X(C)
where LEN(C.value('.', 'varchar(10)')) > 0
select @out
現在你的情況包含兩個步驟:
1.刪除額外的空間,並把它們轉換成單一的空間。你可以使用REPLACE()方法。
SELECT REPLACE(REPLACE(REPLACE("This is a string",' ','<>'),'><',''),'<>',' ')
過程: 最裏面REPLACE改變所有空白到一個低於大於對。 如果這和之間有三個空格,則最裏面的REPLACE返回此處是<> <> <>是。 中間REPLACE將所有大於小於的對變爲空字符串,將其刪除。 <> <> <>變成了<>。
外部REPLACE將所有小於大於比對更改爲單個空白。 <>變成 是。
現在所有的句子都用一個空格標準化。
2.分詞並得到三個單詞。
有很多討論它們的Stackoverflow問題。我喜歡公共表格表達式來拆分字符串:How do I split a string so I can access item x?
讓我知道如果您需要任何幫助拆分單詞。
創建理貨表:
SELECT TOP 11000
IDENTITY(INT,1,1) AS Num
INTO dbo.Tally
FROM Master.dbo.SysColumns sc1,
Master.dbo.SysColumns sc2
GO
創建一個表值函數:
CREATE FUNCTION dbo.[fnSetSplit]
(
@String VARCHAR(8000),
@Delimiter CHAR(1)
)
RETURNS TABLE
AS
RETURN
(SELECT Num,
SUBSTRING(@String, CASE Num
WHEN 1 THEN 1
ELSE Num + 1
END,
CASE CHARINDEX(@Delimiter, @String,
Num + 1)
WHEN 0
THEN LEN(@String) - Num + 1
ELSE CHARINDEX(@Delimiter,
@String, Num + 1)
- Num
- CASE WHEN Num > 1 THEN 1
ELSE 0
END
END) AS String
FROM dbo.Tally
WHERE Num <= LEN(@String)
AND (SUBSTRING(@String, Num, 1) = @Delimiter
OR Num = 1)
)
查詢功能:
SELECT TOP 3
fss.String
FROM dbo.fnSetSplit('This is a string', ' ') fss
WHERE NOT (fss.String = '')
如果需要reconcatenate,用在字符串連接看FOR XML (PATH)
的SQL Server 2016(兼容級別130)允許使用STRING_SPLIT功能:
DECLARE @delimiter varchar(10) = ' '
SELECT STRING_AGG(value, @delimiter)
FROM (SELECT TOP 3 value FROM STRING_SPLIT('This is a string', @delimiter) WHERE LEN(value)>0) inq
SELECT STRING_AGG(value, @delimiter)
FROM (SELECT TOP 3 value FROM STRING_SPLIT('This is a string ', @delimiter) WHERE LEN(value)>0) inq
SELECT STRING_AGG(value, @delimiter)
FROM (SELECT TOP 3 value FROM STRING_SPLIT('This is a string', @delimiter) WHERE LEN(value)>0) inq
SELECT STRING_AGG(value, @delimiter)
FROM (SELECT TOP 3 value FROM STRING_SPLIT('This is a string', @delimiter) WHERE LEN(value)>0) inq
結果:
This is a
This is a
This is a
This is a
會不會有一個方法來解決的問題,如:非法限定名稱字符 – Jarede 2011-09-15 14:56:14
Jarede:建議如果您遇到問題,請創建一個新問題。 – 2011-09-15 15:50:01