Jak działa STRING_SPLIT w języku SQL? Przykłady zastosowania

Jak działa STRING_SPLIT w języku SQL? Przykłady zastosowania

STRING_SPLIT to jedna z najbardziej przydatnych funkcji w SQL Server, szczególnie gdy mamy do czynienia z danymi zawierającymi wartości oddzielone przecinkami lub innymi separatorami. W tym artykule pokażę, jak działa funkcja STRING_SPLIT w języku SQL oraz jakie są jej ograniczenia i zastosowania.

Co to jest STRING_SPLIT?

STRING_SPLIT to wbudowana funkcja T-SQL dostępna od SQL Server 2016. Jest używana do dzielenia ciągu znaków na osobne elementy na podstawie zadanego separatora. Wyniki zwracane są w formie tabeli, co czyni tę funkcję niezwykle przydatną przy pracy z danymi w postaci CSV (comma-separated values).

Podstawowa składnia STRING_SPLIT

Podstawowa składnia funkcji jest bardzo prosta:

SELECT value 
FROM STRING_SPLIT('Jabłko,Banan,Gruszka', ',');

Wynikiem będzie tabela zawierająca pojedynczą kolumnę value, w której każdy element łańcucha jest osobnym wierszem:

value
Jabłko
Banan
Gruszka

Zastosowanie STRING_SPLIT w zapytaniach

Funkcja STRING_SPLIT jest szczególnie przydatna w sytuacjach, gdy chcemy przekonwertować string na zbiór wartości i użyć ich np. w filtrach (WHERE, JOIN itp.).

Przykład użycia STRING_SPLIT w filtrze:

DECLARE @Lista NVARCHAR(100) = '101,102,103';

SELECT * 
FROM Produkty 
WHERE ID IN (SELECT value FROM STRING_SPLIT(@Lista, ','));

Ten kod pozwala traktować przekazaną listę numerów jako zbiór wartości i wyszukać produkty, których ID znajduje się na tej liście.

Ograniczenia funkcji STRING_SPLIT

Choć funkcja STRING_SPLIT jest naprawdę użyteczna, warto znać jej ograniczenia:

  • Dostępna tylko od SQL Server 2016.
  • Nie gwarantuje zachowania kolejności elementów — dane mogą być zwracane w dowolnej kolejności.
  • Nie obsługuje wieloznakowych separatorów (np. ', ' zamiast tylko ',').

STRING_SPLIT z opcją ordinal (SQL Server 2017+)

Od SQL Server 2017 funkcja STRING_SPLIT może zwracać dodatkową kolumnę ordinal, określającą oryginalną pozycję elementu. Możemy to uzyskać, włączając DATABASE SCOPED CONFIGURATION:


ALTER DATABASE SCOPED CONFIGURATION SET COMPATIBILITY_LEVEL = 150;

SELECT value, ordinal
FROM STRING_SPLIT('SQL,Java,Python', ',', 1);

Wynik:

value ordinal
SQL 1
Java 2
Python 3

Dzięki temu możemy zachować porządek oryginalnych wartości, co jest istotne w niektórych scenariuszach.

Alternatywy dla STRING_SPLIT

Jeśli korzystasz ze starszej wersji SQL Server lub potrzebujesz bardziej zaawansowanej obsługi podziału tekstu, warto rozważyć alternatywne metody:

  1. Użytkowe funkcje definicji wierszy (TVF) używające pętli WHILE.
  2. Rozwiązania z XML, np. STRING_AGG() z odwróconą logiką.
  3. Procedury CLR (wywołania kodu .NET), gdy wydajność jest kluczowa.

Podsumowanie

STRING_SPLIT to potężne i wygodne narzędzie do operacji na listach wartości zawartych w łańcuchach znaków. Pomaga w prosty sposób rozdzielić dane na pojedyncze elementy, czyniąc kod SQL bardziej czytelnym i wydajnym. Pomimo kilku ograniczeń, jest to must-have w SQL Server dla wszystkich programistów, którzy często pracują z wartościami CSV.

 

Inny ciekawy artykuł:

Jak działa INITCAP w języku SQL? Przykłady zastosowania

KajoDataSpace