2011-05-03 153 views
1

我想字符串分割成類似下面的話,所有的串的輸出應該是相同的:拆分SQL字符串成字

輸入:

1. This is a string 
2. This is a string 
3. This is a   string 
4. This is   a string 

OUTPUT:

這是

手段,我要從句子的前三個字,不管空間。

回答

3

試試這個:

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 
+0

會不會有一個方法來解決的問題,如:非法限定名稱字符 – Jarede 2011-09-15 14:56:14

+0

Jarede:建議如果您遇到問題,請創建一個新問題。 – 2011-09-15 15:50:01

1

現在你的情況包含兩個步驟:

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?

讓我知道如果您需要任何幫助拆分單詞。

0

創建理貨表:

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)

0

的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