Выберите отдельный список слов, если в записи несколько слов - PullRequest
0 голосов
/ 09 октября 2018

Пожалуйста, рассмотрите следующую таблицу:

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

Мне нужен запрос для составления отдельного списка words, как показано ниже:

foo
bar
baz
foobar
dolor
lorem
ipsum

Как я могу это сделать, еслиМне также нужно разделить words на запятую?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

В Sql Server 2012 вы можете использовать одну из функций разделения, доступных в Интернете (например, 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,',')
0 голосов
/ 09 октября 2018
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
...