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
Dzieki za rozjasnienie zagadnienia upsert. wlasnie sie ucze programowania :).
Co się stanie gdy spróbuję wyszukać:
SELECT * FROM NV_Airport WHERE Code='SVO'
SELECT * FROM V_Airport WHERE Code=N'SVO'
(odwrotnie są te N-ki)
Będzie konwersja czy nie znajdzie żadnego rekordu?