SQL Server 2008 - разбить многозначный столбец на строки с уникальными значениями - PullRequest
4 голосов
/ 18 июня 2011

В базе данных SQL Server 2008 у меня есть столбец с несколькими значениями, разделенными точками с запятой.Некоторые значения содержат двоеточия.Пример данных:

key:value;key2:value;blah;foo;bar;A sample value:whee;others
key:value;blah;bar;others
A sample value:whee

Я хочу получить все уникальные значения из каждой строки в отдельных строках:

key:value
key2:value
blah
foo
bar
A sample value:whee
others

Я просмотрел различные функции split, но все онипохоже, что имеют дело с жестко закодированными строками, а не со строками из столбца в таблице.Как я могу это сделать?

Редактировать: Томас ответ получил!Вот мой последний запрос:

With SampleInputs As
    (
    select distinct myColumn from [myDatabase].[dbo].myTable where myColumn != ''
    )
    , XmlCte As
    (
    Select Cast( '<z>' + Replace( myColumn, ';', '</z><z>' ) + '</z>' As xml ) As XmlValue
    From SampleInputs As I
    )
Select Distinct Y.z.value('.','nvarchar(max)') As Value
From XmlCte
    Cross Apply XmlValue.nodes('//z') Y(z)

Я предполагаю, что вещи XmlValue.nodes и Y.z.value - это магия.O_o

Ответы [ 2 ]

3 голосов
/ 18 июня 2011

Используя функцию разделения, вы применяете перекрестное применение:

select distinct SS.part
from YourTable
  cross apply dbo.SplitString(YourColumn, ';') as SS

Здесь SplitString принимает два аргумента: строковый столбец и разделитель и имеет столбец с именем part, в котором возвращаются значения.

2 голосов
/ 18 июня 2011
With SampleInputs As
    (
    Select 'key:value;key2:value;blah;foo;bar;A sample value:whee;others' As [Data]
    Union All Select 'key:value;blah;bar;others' 
    Union All Select 'A sample value:whee'
    )
    , XmlCte As
    (
    Select Cast( '<z>' + Replace( I.[Data], ';', '</z><z>' ) + '</z>' As xml ) As XmlValue
    From SampleInputs As I
    )
Select Distinct Y.z.value('.','nvarchar(max)') As Value
From XmlCte
    Cross Apply XmlValue.nodes('//z') Y(z)

Обновление

Вот версия выше, которая обрабатывает объекты:

With SampleInputs As
    (
    Select 'key:value;key2:value;blah;foo;bar;A sample value:whee;others' As [Data]
    Union All Select 'key:value;blah;bar;others' 
    Union All Select 'A sample value:whee'
    Union All Select 'A sample value:<Oops>'
    )
    , XmlGoo As
    (
    Select Cast(
            Replace(
                Replace( Cast( Z.XmlValue As nvarchar(max) ), '{{', '<z>' )
                , '}}', '</z>')
            As Xml ) As Xmlvalue
    From    (
            Select Cast(
                    (
                    Select '{{' + Replace( [Data], ';', '}}{{' ) + '}}'
                    From SampleInputs
                    For Xml Path(''), type
                    ) As Xml ) As XmlValue
            ) As Z
    )
Select Distinct Z.data.value('.', 'nvarchar(max)')
From XmlGoo
    Cross Apply XmlValue.nodes('/z') Z(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...