Как я могу объединить все значения в строке в строку? - PullRequest
0 голосов
/ 16 октября 2018

Предположим, у меня есть строка данных, хранящая, например, следующее:

    ------------------------
   | Col 1 | Col 2 | Col 3  |
   |------------------------|
   |  Foo  |  Bar  | Foobar |

Как я могу объединить это в одну строку, например ниже?

Foo-Bar-Foobar

Заголовки столбцов (и количество заголовков столбцов) в этой таблице не будут известны, поэтому выбор по имени столбца не является вариантом (?).

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

Ответы [ 4 ]

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

Улучшенная версия ответа JonTout:

    Declare @Columns NVARCHAR(MAX)
    Declare @Table varchar(15) = 'TableName'

    SELECT @Columns=COALESCE(@Columns + '+', '') +'CONVERT(varchar(max),ISNULL('+ COLUMN_NAME+',''''))+''-'''
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE (TABLE_NAME=@Table ) 


    EXEC('SELECT ' + @Columns + ' FROM ' + @Table)
0 голосов
/ 16 октября 2018

Я использую UnitE, и это то, что я использовал бы для динамического выбора столбцов из таблицы person.

INFORMATION_SCHEMA.COLUMNS хранит список столбцов для таблицы, и на этом строится инструкция SELECT.

Declare @Columns NVARCHAR(MAX)
Declare @Table varchar(15) = 'capd_person'

SELECT @Columns=COALESCE(@Columns + ',', '') + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (TABLE_NAME=@Table )  

EXEC('SELECT DISTINCT ' + @Columns + ' FROM ' + @Table)

Вам нужно изменить команду EXEC в соответствии с вашими потребностями, используя CONCAT какописано ранее.

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

В таких случаях я действительно обожаю мощные возможности XML в работе с универсальными наборами:

SELECT STUFF(b.query('
                        for $element in ./*
                        return
                        <x>;{$element/text()}</x>
                       ').value('.','nvarchar(max)'),1,1,'')
FROM 
(   
    SELECT TOP 3 * FROM sys.objects o FOR XML PATH('row'),ELEMENTS XSINIL,TYPE
) A(a)
CROSS APPLY a.nodes('/row') B(b);

Результат

sysrscols;3;4;0;S ;SYSTEM_TABLE;2017-08-22T19:38:02.860;2017-08-22T19:38:02.867;1;0;0
sysrowsets;5;4;0;S ;SYSTEM_TABLE;2009-04-13T12:59:05.513;2017-08-22T19:38:03.197;1;0;0
sysclones;6;4;0;S ;SYSTEM_TABLE;2017-08-22T19:38:03.113;2017-08-22T19:38:03.120;1;0;0

Замечания

Некоторые вещиупоминание

  • Я использую ; в качестве разделителя, так как - может разрываться со значениями, содержащими дефисы (например, DATE)
  • Я использую TOP 3 от sys.objects досоздать easy-cheesy-автономный образец
  • Thx to Zohard Peled Я добавил ELEMENTS XSINIL, чтобы заставить двигатель не пропускать значения NULL.

ОБНОВЛЕНИЕ Создание JSON в версиях до 2016 года

Вы можете попробовать создать JSON-строку в версиях до 2016 года

SELECT '{' 
      + STUFF(b.query('
                        for $element in ./*
                        return
                        <x>,"{local-name($element)}":"{$element/text()}"</x>
                       ').value('.','nvarchar(max)'),1,1,'')
      + '}'
FROM 
(   
    SELECT TOP 3 * FROM sys.objects o FOR XML PATH('row'),TYPE
) A(a)
CROSS APPLY a.nodes('/row') B(b);

Результат

{"name":"sysrscols","object_id":"3","schema_id":"4","parent_object_id":"0","type":"S ","type_desc":"SYSTEM_TABLE","create_date":"2017-08-22T19:38:02.860","modify_date":"2017-08-22T19:38:02.867","is_ms_shipped":"1","is_published":"0","is_schema_published":"0"}
{"name":"sysrowsets","object_id":"5","schema_id":"4","parent_object_id":"0","type":"S ","type_desc":"SYSTEM_TABLE","create_date":"2009-04-13T12:59:05.513","modify_date":"2017-08-22T19:38:03.197","is_ms_shipped":"1","is_published":"0","is_schema_published":"0"}
{"name":"sysclones","object_id":"6","schema_id":"4","parent_object_id":"0","type":"S ","type_desc":"SYSTEM_TABLE","create_date":"2017-08-22T19:38:03.113","modify_date":"2017-08-22T19:38:03.120","is_ms_shipped":"1","is_published":"0","is_schema_published":"0"}

Подсказка

Вы также можете добавить ELEMENTS XSINIL к этому запросу.Это зависит от того, хотите ли вы, чтобы значения NULL просто пропускались, или если вы хотите включить их как "SomeColumn":""

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

Просто сделайте SELECT CONCAT(col1,col2,col3) FROM table

Однако, если вы хотите сделать его аккуратным

Использование: SELECT CONCAT(col1,'-',col2,'-',col3) FROM table.

Найти дополнительную помощь здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...