#sql #tsql
#sql #tsql
Вопрос:
Ниже приведены два запроса, я пытаюсь проработать следующие вопросы во время моего задания по изучению sql.
-
Запрос 1 — Как это будет называться в sql? Я пытался выполнить поиск в Интернете по примерам использования, но не знаю, по чему искать.
-
Запросы 1 и 2 дают мне одинаковый результат, они разные? Планы выполнения выглядят аналогично, за исключением того, что в последнем из них есть один дополнительный шаг: шаг с 0% стоимостью UDX
-
Что было бы предпочтительнее для помещения строки в строку?
-
Это единственные способы в 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.
- Это встроенная функция. Обновления в более поздних версиях могут ускорить процесс без необходимости изменения какого-либо кода.
- Цель намного яснее, чем у других методов. Если кто-то другой просматривает ваш SQL, не возникает вопросов о том, чего вы пытаетесь достичь.
- Легче расширять. Если вы не разбираетесь в 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