如果每个记录有多个单词,则选择单词的不同列表

时间:2018-10-09 14:32:04

标签: sql-server tsql sql-server-2012

请考虑下表:

words
-------------
foo
bar
bar, baz
foobar, foo, bar, dolor
lorem, ipsum
ipsum

我需要一个查询来编译words的不同列表,如下所示:

foo
bar
baz
foobar
dolor
lorem
ipsum

如果我还需要用逗号分隔words怎么办?

2 个答案:

答案 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,',')

结果:

enter image description here

从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