Могу ли я заказать результаты конкатенации в TSQL? - PullRequest
2 голосов
/ 09 июля 2010

SQL Server 2008 - я хочу объединить четыре столбца в значения с разделителями, но я хочу, чтобы они были расположены в алфавитном порядке. Возможно ли это?

** ОБНОВЛЕНИЕ: ** Подробнее ... Это будет использоваться на приблизительно 700k-1M строках в день в задании ETL через SSIS. Если есть более простой способ сделать это в SSIS, пожалуйста, сообщите мне (задача сценария и т. Д.). Это также можно сделать в хранимом процессе.

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

Ответы [ 3 ]

4 голосов
/ 10 июля 2010

Отключить столбцы в строки, затем упорядочить строки. Используйте любую технику конкатенации строк , которую вы предпочитаете, например, трюк FOR XML:

with cte as (
select *
from (values ('A' ,'C', 'B' ,'D')) as T (c1, c2, c3, c4))
select Value + ',' as [*]
from cte
unpivot (Value for c in (c1, c2, c3, c4)) as u
order by Value
for xml path('')
1 голос
/ 09 июля 2010

Сложно, но это будет работать:

   Select Case 
         When a>b And a>c And a>d Then a + ',' +
             Case When b>c And b>d Then b + ',' +
                      Case When c>d Then c Else d End 
                  When c>b And c>d Then c + ',' +
                      Case When b>d Then b Else d End 
                  When d>b And d>c Then d + ',' +
                      Case When b>c Then b Else c End End +
         When b>a And b>c And b>d Then b + ',' +
             Case When a>c And a>d Then a + ',' +
                      Case When c>d Then c Else d End 
                  When c>a And c>d Then c + ',' +
                      Case When a>d Then a Else d End 
                  When d>a And d>c Then a + ',' +
                      Case When a>c Then a Else c End End + ',' +
          etc... 
    End

но я бы сделал это в коде, а не в базе данных ...

РЕДАКТИРОВАТЬ: (как вычисляемый столбец):

  Alter Table MyTable Add Column SortedABCD As
        Case 
             When a>b And a>c And a>d Then a + ',' +
                 Case When b>c And b>d Then b + ',' +
                          Case When c>d Then c Else d End 
                      When c>b And c>d Then c + ',' +
                          Case When b>d Then b Else d End 
                      When d>b And d>c Then d + ',' +
                          Case When b>c Then b Else c End End +
             When b>a And b>c And b>d Then b + ',' +
                 Case When a>c And a>d Then a + ',' +
                          Case When c>d Then c Else d End 
                      When c>a And c>d Then c + ',' +
                          Case When a>d Then a Else d End 
                      When d>a And d>c Then a + ',' +
                          Case When a>c Then a Else c End End + ',' +
              etc... 
        End
1 голос
/ 09 июля 2010

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

Заявление монстра CASE, вероятно, будет гораздо более эффективным, но вот один из способов без

WITH t AS
(
SELECT 1 as rowid, 'cat' as C1, 'apple' As C2, 
      'bear' AS C3, 'fox' AS C4 UNION ALL
SELECT 2 as rowid, 'B' as C1, 'D' As C2, 'E' AS C3, 'G' AS C4 
)

SELECT rowid,   STUFF((SELECT ',' + C FROM 
(
SELECT C1 AS C FROM t t2 WHERE  t.rowId = t2.rowId
UNION ALL
SELECT C2 AS C FROM t t2 WHERE  t.rowId = t2.rowId
UNION ALL
SELECT C3 AS C FROM t t2 WHERE  t.rowId = t2.rowId
UNION ALL
SELECT C4 AS C FROM t t2 WHERE  t.rowId = t2.rowId
) D
ORDER BY C
        FOR XML PATH('')),1,1,'') X

Придает

rowid       X
1           apple,bear,cat,fox
2           B,D,E,G
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...