请考虑下表:
words
-------------
foo
bar
bar, baz
foobar, foo, bar, dolor
lorem, ipsum
ipsum
我需要一个查询来编译words
的不同列表,如下所示:
foo
bar
baz
foobar
dolor
lorem
ipsum
如果我还需要用逗号分隔words
怎么办?
答案 0 :(得分:1)
在Sql Server 2012中,您可以使用Web上可用的拆分功能(例如,可用here的DelimitedSplit8K)隔离单个单词。使用cross apply
,您可以将该函数应用于源表中的所有行:
declare @words table (list_of_words varchar(8000))
insert into @words values
('foo')
,('bar')
,('bar, baz')
,('foobar, foo, bar, dolor')
,('lorem, ipsum')
,('ipsum')
select distinct(ltrim((rtrim(Item)))) as single_words
from @words
cross apply [dbo].[DelimitedSplit8K](list_of_words,',')
结果:
从SQL Server 2016开始,您可以使用string_split
隔离单个单词:
declare @words table (list_of_words varchar(max))
insert into @words values
('foo')
,('bar')
,('bar, baz')
,('foobar, foo, bar, dolor')
,('lorem, ipsum')
,('ipsum')
select distinct(trim(value)) as single_words
from @words
cross apply string_split(list_of_words,',')
答案 1 :(得分:0)
DECLARE @words TABLE (
Info VARCHAR(100)
)
INSERT @words
VALUES
('foo'),
('bar'),
('bar, baz'),
('foobar, foo, bar, dolor'),
('lorem, ipsum'),
('ipsum')
SELECT DISTINCT word
FROM (
SELECT CAST('<X>'+replace(w.Info,', ','</X><X>')+'</X>' as XML) as x
FROM @words w
) T1
CROSS APPLY (
SELECT n.D.value('.','varchar(100)') as word
FROM T1.x.nodes('X') as n(D)
) T2