我想将字符串拆分成下面的单词,所有字符串的输出应该相同:
INPUT:
1. This is a string
2. This is a string
3. This is a string
4. This is a string
输出:
这是
意思是,无论空格如何,我都希望句子中的前三个单词。
答案 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