Počínaje SQL Serverem 2017 můžete nyní zobrazit výsledky dotazu jako seznam. To znamená, že se vaše sada výsledků může zobrazit jako seznam oddělený čárkami, seznam oddělený mezerami nebo jakýkoli oddělovač, který se rozhodnete použít.
I když je pravda, že stejného efektu jste mohli dosáhnout před SQL Serverem 2017, bylo to trochu nemotorné.
Transact-SQL nyní obsahuje STRING_AGG()
funkce, která zřetězí hodnoty řetězcových výrazů a umístí mezi ně oddělovací hodnoty. Funguje to v podstatě stejně jako GROUP_CONCAT()
MySQL funkce.
Tento článek obsahuje příklady, které demonstrují STRING_AGG()
T-SQL funkce.
Ukázková data
Nejprve je zde několik ukázkových dat.
SELECT TaskId, TaskName FROM Tasks;
Výsledek:
TaskId TaskName ------ ------------1 Krmte kočky 2 Vodní pes 3 Krmná zahrada 4 Malovaný koberec5 Čistá střecha 6 Krmte kočky
Příklad – seznam oddělený čárkami
Takže bychom mohli vzít výše uvedená data a použít STRING_AGG()
funkce pro seznam všech názvů úkolů v jednom velkém seznamu odděleném čárkami.
Takhle:
SELECT STRING_AGG(TaskName, ', ') FROM Tasks;
Výsledek:
Krmení koček, Vodní pes, Krmná zahrada, Natírání koberce, Čistá střecha, Krmení koček
Samozřejmě to nemusí být nutně odděleno čárkou. Může být oddělen libovolným výrazem NVARCHAR
nebo VARCHAR
typu a může to být literál nebo proměnná.
Příklad – Kombinování sloupců
Můžeme také použít CONCAT()
funkce pro spojení dvou polí, oddělených vlastním oddělovačem.
Příklad:
SELECT STRING_AGG(CONCAT(TaskId, ') ', TaskName), ' ') FROM Tasks;
Výsledek:
1) Nakrmit kočky 2) Napustit psa 3) Nakrmit zahradu 4) Natřít koberec 5) Vyčistit střechu 6) Nakrmit kočky
Příklad – hodnoty Null
Pokud vaše sada výsledků obsahuje hodnoty null, budou tyto hodnoty ignorovány a nebude přidán odpovídající oddělovač.
Pokud to není vhodné, můžete zadat hodnotu pro hodnoty null pomocí ISNULL()
funkce a předání hodnoty, kterou chcete použít, kdykoli narazíte na hodnotu null. Tím zajistíte, že stále dostanete výsledek, když řádek obsahuje hodnotu null.
Zvažte například následující sadu dotazů a výsledků:
SELECT TaskCode FROM Tasks;
Výsledek:
Kód úlohy--------cat123 null null pnt456 rof789 null
Vidíme, že v sadě výsledků jsou tři hodnoty null.
Pokud to spustíme pomocí STRING_AGG()
funkce, dostaneme toto:
SELECT STRING_AGG(TaskCode, ', ') FROM Tasks;
Výsledek:
cat123, pnt456, rof789
Pokud však použijeme ISNULL()
funkce, která poskytuje zástupný symbol pro jakékoli hodnoty null, dostaneme toto:
SELECT STRING_AGG(ISNULL(Kód úlohy, 'N/A'), ', ') Z Úkolů;
Výsledek:
cat123, N/A, N/A, pnt456, rof789, N/A
Příklad – seskupené výsledky
Můžete také použít STRING_AGG()
funkce při seskupování sady výsledků. Můžete například chtít seznam alb seskupených podle interpreta.
Pro demonstraci si představte databázi se dvěma tabulkami; Artists
a Albums
. Mezi těmito tabulkami existuje vztah jedna k mnoha. Pro každého umělce může existovat mnoho alb.
Takže běžný dotaz spojující obě tabulky může vypadat nějak takto:
USE Music;SELECT ar.ArtistName, al.AlbumNameFROM Interpreti arINNER JOIN Alba alON ar.ArtistId =al.ArtistId;
Výsledek:
Název interpreta Název alba ------------------------- -------------------- ---- Iron Maiden Powerslave AC/DC napájení Jim Reeves zpívá po uličce Devin Townsend Ziltoid Vševědoucí Devin Townsend Oběti Cool Devin Townsend Epicloud Iron Maiden Někde v čase Iron Maiden Kousek mysli Zabijáci Iron Maiden Iron Maiden Žádná modlitba za umírající Scénář Bez ticha není zvuk Buddy Bohatý Big Swing Face Michael se učí rockovat Modrá noc Michael se učí rockovat věčnost Michael se učí rockovat Skandinávii Tom Jones Dlouho ztracený kufr Tom Jones Chvála a vina Tom Jones Along Came Jones Allan Holdsworth Celou noc Špatně Allan Holdsworth The Sixteen Men of Tain
Jak vidíte, pokud má interpret více než jedno album, je jméno interpreta uvedeno vícekrát – pro každé album jednou.
Můžeme ale použít STRING_AGG()
to změnit tak, že každého interpreta uvedeme pouze jednou a za ním následuje seznam alb, která vydali, oddělených čárkami:
USE Music;SELECT ar.ArtistName, STRING_AGG(al.AlbumName, ', ')FROM Artists arINNER JOIN Albas alON ar.ArtistId =al.ArtistIdGROUP BY ArtistName;
Výsledek:
Jméno interpreta ------------------------ --------------------- -------------------------------------------------- ------- Napájení AC/DC Allan Holdsworth Celou noc špatně, The Sixteen Men of Tain Buddy Rich Big Swing Face Devin Townsend Ziltoid the Omniscient, Casualties of Cool, Epicloud Iron Maiden Powerslave, Somewhere in Time, Piece of Mind, Killers, No Prayer for the Dying Jiim Reeves Zpívání Down the Lane Michael se učí rockovat Modrá noc, věčnost, Skandinávie Scénář Žádný zvuk bez ticha e Tom Jones Dlouho ztracený kufr, Chvála a vina, Along Came Jones
Příklad – řazení výsledků
K uspořádání výsledků v rámci zřetězené skupiny můžete použít klauzuli objednávky. To se provádí pomocí WITHIN GROUP
doložka. Při použití této klauzule určíte objednávku pomocí ORDER BY
následovaný buď ASC
(pro vzestupné) nebo DESC
(pro sestupné).
Příklad:
POUŽÍVEJTE hudbu;SELECT ar.ArtistName, STRING_AGG(al.AlbumName, ', ') WITHIN GROUP (POŘADÍTE PODLE AL.AlbumName DESC)FROM Artists arINNER JOIN Alba alON ar.ArtistId =al.ArtistIdGROUP;
Výsledek:
Jméno interpreta ------------------------ --------------------- -------------------------------------------------- ------- AC/DC Powerage Allan Holdsworth Šestnáct mužů z Tainu, Celou noc Špatný Buddy Bohatý Velký Swing Face Devin Townsend Vševěd Ziltoid, Epicloud, Oběti Cool Iron Maiden Někde v čase, Powerslave, Kousek mysli, No Prayer for the Dying, KillersJim Reeves Zpívá Down the Lane Michael se učí rockovat Skandinávii, Eternity, Blue Night Scénář Bez ticha není zvuk e Tom Jones Chvála a vina, Dlouho ztracený kufr, Along Came Jones