Объединение строк в одну строку, каковы различные способы и как они называются?

#sql #tsql

#sql #tsql

Вопрос:

Ниже приведены два запроса, я пытаюсь проработать следующие вопросы во время моего задания по изучению sql.

  1. Запрос 1 — Как это будет называться в sql? Я пытался выполнить поиск в Интернете по примерам использования, но не знаю, по чему искать.

  2. Запросы 1 и 2 дают мне одинаковый результат, они разные? Планы выполнения выглядят аналогично, за исключением того, что в последнем из них есть один дополнительный шаг: шаг с 0% стоимостью UDX

  3. Что было бы предпочтительнее для помещения строки в строку?

  4. Это единственные способы в sql для объединения строк в одну строку

Большое спасибо.

— Запрос 1

 declare @string varchar(max)    
select @string = coalesce(@string, '')   coalesce(col1, '')     
from   
(
   select '1' as col1    
   Union    
   select '2' as col1    
   Union    
   select '3' as col1    
   Union    
   select '4' as col1          
) x

select @string;
  

— Запрос 2

 with cte_string
as
(
 select '1' as col1
 union
 select '2' as col1
 Union
 select '3' as col1
 Union
 select '4' as col1
)

select cast(col1 as nvarchar(1))
from cte_string    
for xml path(''), type;
  

Комментарии:

1. Предпочтительным способом выполнения агрегированной конкатенации строк является string_agg() , но он доступен только в самых последних версиях SQL Server.

2. Я использую SQL Server 2016 Developer Edition

3. Только что проверил, и я не могу сделать: ВЫБЕРИТЕ STRING_AGG ([Col1], CHAR(1)) до выпуска 2017 года, но string_agg() новый для меня и что-то еще, что мне нужно проверить.

Ответ №1:

Как вы заметили, в SQL существует несколько способов объединения строк. Я не уверен, что существуют конкретные имена для этих используемых методов. Я бы описал это как «Я объединяю строки, используя …».

Предпочитаемое действительно зависит от вашего личного вкуса больше, чем от чего-либо еще. Например, моим предпочтительным методом было бы использование STRING_AGG, даже если это медленнее по причинам, указанным ниже. Так что сделайте себе одолжение и обновите свой SQL server.

  1. Это встроенная функция. Обновления в более поздних версиях могут ускорить процесс без необходимости изменения какого-либо кода.
  2. Цель намного яснее, чем у других методов. Если кто-то другой просматривает ваш SQL, не возникает вопросов о том, чего вы пытаетесь достичь.
  3. Легче расширять. Если вы не разбираетесь в SQL, если вы хотите добавить запятую или любой другой разделитель между каждым отдельным значением, вам придется подумать, что вам придется изменить для достижения этой цели. С STRING_AGG это просто вопрос изменения параметра. Использование GROUP BY в запросе с помощью STRING_AGG является тривиальным. В других методах не так много.

Объединение с использованием COALESCE:

 DECLARE @string VARCHAR(MAX)

SELECT @string = COALESCE(@string, '')   COALESCE([value], '')
FROM (
    SELECT '1' AS [value]
    UNION
    SELECT '2'
) AS [t]

SELECT @string
  

Объединение с использованием FOR XML PATH:

 DECLARE @string VARCHAR(MAX)

SELECT @string = (
SELECT ''   [value]
FROM (
    SELECT '1' AS [value]
    UNION
    SELECT '2'
) AS [t]
FOR XML PATH(''))

SELECT @string
  

Объединение с использованием общего табличного выражения.

 WITH cte_string AS
(
    SELECT '1' AS [value]
    UNION
    SELECT '2'
)
SELECT ''   [value]
FROM cte_string
FOR XML PATH('')
  

Объединение с использованием новой функции STRING_AGG в SQL 2017:

 DECLARE @string VARCHAR(MAX)

SELECT @string = STRING_AGG([value], '')
FROM (
    SELECT '1' AS [value]
    UNION
    SELECT '2'
) AS [t]

SELECT @string