Найти уникальные значения в столбце текста через запятую - PullRequest
2 голосов
/ 19 декабря 2011

У меня есть столбец "A", разделенные запятыми, и я хочу найти все уникальные значения в столбце A.

Вот очень короткий пример:

Column A
111, 222
333
444
777,999

Iхочу запрос, который дает мне следующее значение:

Column C
111
222
333
444
777
999

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

Игнорирование очевидных проблем с дизайном вашей таблицы, о которых упоминалось во всех комментариях, и признание того, что на огромной таблице это может оказаться очень медленным, вот как я могу это сделать.

Сначала ... я бы создал оператор, который превратил бы все строки в один большой массив с разделителями-запятыми.

DECLARE @tmp VarChar(max)
SET @tmp = ''
SELECT @tmp = @tmp + ColumnA + ',' FROM TableA

Затем используйте табличное значение udf split, описанное в этой статье SO, чтобы превратить эту массивную строку обратно в таблицу с отдельным выражением, чтобы убедиться, что она уникальна.

https://stackoverflow.com/a/2837662/261997

SELECT DISTINCT * FROM dbo.Split(',', @tmp)
0 голосов
/ 19 декабря 2011

Вы можете использовать известную функцию Split в сочетании с outer apply, чтобы разбить строки на несколько строк:

select  ltrim(rtrim(s.s)) as colC
from    @t t
cross apply
        dbo.split(',', t.colA) s

Пример полного кода:

if object_id('dbo.Split') is not null
    drop function dbo.Split
go
CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
  )
go
declare @t table (colA varchar(max))
insert @t select '111, 223'
union all select '333'
union all select '444'
union all select '777,999';

select  ltrim(rtrim(s.s)) as colC
from    @t t
cross apply
        dbo.split(',', t.colA) s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...