将sql字符串拆分为单词

时间:2011-05-03 20:48:44

标签: string sql-server-2005

我想将字符串拆分成下面的单词,所有字符串的输出应该相同:

INPUT:

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

输出:

  

这是

意思是,无论空格如何,我都希望句子中的前三个单词。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

现在您的案例包含两个步骤:

1。删除其他空格并将其转换为单个空格。你可以使用REPLACE()方法。

SELECT REPLACE(REPLACE(REPLACE("This    is   a   string",' ','<>'),'><',''),'<>',' ')

过程: 最里面的REPLACE将所有空格更改为小于大于对的空格。 如果This和is之间有三个空格,则最里面的REPLACE返回This&lt;&gt;&lt;&gt;&lt;&gt; is。 中间REPLACE将所有大于小于对的值更改为空字符串,从而删除它们。 &lt;&gt;&lt;&gt;&lt;&gt;成为&lt;&gt;是。

外部REPLACE将所有小于大于的对更改为单个空白。 &lt;&gt;变为 是。

现在所有句子都用一个空格标准化。

2。拆分单词并获得三个单词。

有很多讨论它们的Stackoverflow问题。我喜欢Common Table Expression来分割字符串:How do I split a string so I can access item x?

如果您在分割单词时需要任何帮助,请告诉我。

答案 2 :(得分: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 = '' )

如果需要进行协调,请使用FOR XML (PATH)

查看字符串连接

答案 3 :(得分: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