Spis treści:

Kategoria:SQL Server


SQL Server i wyszukiwanie znaków specjalnych w tekście

Jak w tekście znaleźć %?

Jakiś czas temu pisałem o trudnej sztuce wyszukiwania łańcuchów znaków w kolumnach pasujących do zadanego wzorca za pomocą instrukcji LIKE. Sprawa już wtedy mocno się komplikowała. Jak wiemy, w SQL Server znajduje się kilka znaków specjalnych, między innymi % i _. Co mamy zrobić, jeżeli rzeczywiście poszukujemy znaku procenta? Nie możemy przecież napisać LIKE '%', bo SQL Server zwróci nam wszystkie rekordy. Zapamiętajmy sobie zatem:

--Tak nie można, to nie będzie działało
SELECT Kolumna FROM Tabela WHERE
Kolumna LIKE '%%%'

W poprzednim artykule (Znaki specjalne SQL w zapytaniach LIKE) opisałem zastosowanie nawiasów kwadratowych, za pomocą których definiujemy zbiór znaków dozwolonej na konkretnej pozycji. To jest właśnie jedna z metod wyszukiwania znaku % w tekście. Popatrzmy na przykład:

--Wyszukiwanie w tekście znaku %
SELECT Kolumna FROM Tabela WHERE
Kolumna LIKE '%[%]%'

Jak poradzić sobie ze znakami [ i ]

Wiemy już, jak poradzić sobie ze znakiem procenta (%). Podobnie można sobie poradzić ze znakiem podkreślenia (_). Co ze znakami [ i ]? Warto zapamiętać, że znak ], do tej pory zawsze określany jako znak specjalny, nie jest pełnoprawnym znakiem specjalnym. Jest to znak specjalny kontekstowy. Oznacza to, że umieszczenie go w warunku LIKE nie wymaga żadnych dodatkowych operacji. Popatrzmy na przykład zapytania, w którym wykorzystywany jest znak ]:

SELECTFROM Tabela WHERE Kolumna LIKE '%]%'

Jak widać, zapytanie nie różni się od innych zapytań tego typu. Sytuacja wygląda zupełnie inaczej, jeżeli musimy znaleźć łańcuchy znaków zawierające znak [. W takim przypadku należy go otoczyć znakami... [ i ]. Przyjrzyjmy się zatem następującemu zapytaniu:

--Znak [ otoczony znakami [ i ]
SELECTFROM AdresyClustered WHERE Ulica LIKE '%[[]%'

Uniwersalny sposób

Zanim przejdziemy do wyjaśnienia ostatniego sposobu, przyjrzyjmy się składni instrukcji warunkowej LIKE:

PrzeszukiwanaWartość [ NOTLIKE Wzorzec [ ESCAPE znakUcieczki]

Kluczowym elementem tej układanki jest składnia ze słowem kluczowym ESCAPE. Służy ona do definiowania znaku, który likwiduje, znosi, nazwijmy to sobie, "specjalność" znaku specjalnego. Przyjrzyjmy się teraz sposobowi wyszukania tekstu [ABC] w dowolnej kolumnie z wykorzystaniem znaku ucieczki. Przykład zaprezentowany jest poniżej:

SELECTFROM Tabela WHERE Kolumna LIKE '%\[ABC\]%' ESCAPE '\'

Znak [ poprzedzony znakiem ucieczki traci swoją moc, traktowany jest jak każdy inny znak. Na wszelki wypadek anulowana jest moc znaku ], chociaż akurat to posunięcie nie jest konieczne. Na koniec warto sobie zadać szalenie ważne pytanie. Co ze znakiem ucieczki? Znak ucieczki należy w takim przypadku poprzedzić drugim znakiem ucieczki. Przyjrzyjmy się zatem ostatniemu przykładowi. Tym razem zamierzamy wyszukać tekst [ABC]\. Przykładowe rozwiązanie pokazane jest poniżej.

SELECTFROM Tabela WHERE Kolumna LIKE '%\[ABC\]\\%' ESCAPE '\'

Wnioski

Wyszukiwanie łańcuchów znaków w kolumnach tabel bazy danych zwykle nie jest zadaniem trudnym. Mam nadzieję, że większość przypadków została szczegółowo opisana. Zachęcam do dzielenia się ciekawymi przypadkami w komentarzach.

Kategoria:SQL Server

, 2013-12-20

Komentarze:

Kazuhi (2016-08-03 13:01:40)
A jak znaleźć znak "_" na początku nazwy? Chodzi o to że muszę wyświetlić nazwy tabel zaczynające się od znaku '_'.
PD (2016-08-03 14:28:17)
Należy zastosować tę samą technikę co w przypadku %:
SELECT *
FROM (VALUES ('Kot'), ('_Pies'), ('Krowa'), ('_Lis')) T(Name)
WHERE Name LIKE '[_]%'
Kazuhi (2016-08-04 10:56:20)
Dzięki za pomoc :)
Tomson (2018-01-26 12:38:13)
Fajny artykuł...
A jak usunąć ze stringa znak '
?
Tomson (2018-01-26 14:36:45)
Ok, ogarnąłem to poprzez char(39)
Tomek (2020-02-18 15:53:37)
SIEMA dobre info
Dodaj komentarz
Wyślij
Ostatnie komentarze
To samo pytanie co wyżej. Mam za zadanie dodać kolumnę do istniejącej tabeli łącząc obie inne kolumny ze sobą, ale nie mam pojęcia jak za to się zabrać
działa :) tylko była literówka :)
Podziękował. Trochę późno, po 8 latach, ale dzięki za testy (rozumiem że dla SQL2012 robione). Tak się właśnie zastanawiałem ile złego czynię stosując czasem __(max).
Super robota, korzystając z innych internetowych kalkulatorow po prostu wątpiłem w ich prawdomówność, w końcu trafiłem tutaj i wynik w końcu jest wiarygodny. 40 km w 2 h 810 kcal, ciekawostka: na fitatu wyliczyło mi 5700 kcal 😊 najlepiej będzie chyba jak kupię zegarek sportowy.
Wielkie dzieki za solidne wyjasnienia tematu.