Znaki specjalne SQL w zapytaniach LIKE
Znaki specjalne stosowane w warunku LIKE
Jak zapewne wiemy, LIKE służy do sprawdzenia, czy podany ciąg znaków, lub ciąg znaków z danej kolumny, spełnia pewne zdefiniowane kryteria. Wielkim uproszczeniem byłoby pozostawienie jedynie możliwości porównania dwóch wartości tekstowych. Jak postąpilibyśmy wtedy, gdybyśmy potrzebowali wszystkich wartości z kolumny, które zaczynają się na literę B? W takiej sytuacji stosujemy znaki specjalne. Należą do nich między innymi znaki _ i %.
Znak %
Znak % zastępuje dowolny ciąg znaków, także pusty. Jest to odpowiednik znaku specjalnego * używana w większości popularnych systemów operacyjnych.
Przyjrzyjmy się następującemu przypadkowi.
Zadanie 1. Potrzebujemy wszystkich rekordów z tabeli Adresy, których ulica zaczyna się od litery U.
Poniżej znajduje się przykładowe rozwiązanie:
Procent, jak łatwo zauważyć zastępuje dowolny ciąg dowolnych znaków. Procent może znajdować się na początku, na końcu, w środku, może też być użyty wielokrotnie. Przyjrzyjmy się przykładowi numer 2.
Zadanie 2. Potrzebujemy wszystkich rekordów z tabeli Adresy, w których w nazwie ulicy znajduje się ciąg znaków "kot".
Przykładowe rozwiązanie może wyglądać na przykład tak:
Wyszukujemy zatem wszystkie nazwy, które mają dowolny ciąg znaków, następnie sekwencję "kot", a na końcu znów dowolny ciąg znaków.
Znak _, mylony ze znakiem ?
Znak podkreślenia (_) z definicji zastępuje jeden, tylko jeden i dokładnie jeden dowolny znak w tekście. Jak już wspomniałem, znaki specjalne stosowane są w większości systemów operacyjnych. O ile znak % rzadko jest mylony, o tyle w przypadku wyszukiwania pojedynczego wystąpienia dość często mylony jest znak _ ze znakiem ?. Zapamiętajmy: znak _ jest w SQLu, znak ? w systemach operacyjnych.
Przyjrzyjmy się takiemu oto przykładowi
Zadanie 3. Potrzebne są nam wszystkie przednioty z tabeli Przedmioty, których nazwa zaczyna się na "Ko" i ma tylko trzy litery.
Rozwiązanie zaprezentowano poniżej:
Wynikiem takiego zapytania mogą być nazwy typu: Koń, Kot, Kos, Kod, Koc ale nie będą już żadne wyrazy dwuliterowe, czteroliterowe i dłuższe.
Przyjrzyjmy się jeszcze jednemu przykładowi:
Zadanie 4. Potrzebne są nam wszystkie przednioty z tabeli Przedmioty, których nazwa zaczyna się na "K" i ma dokładnie cztery litery.
Rozwiązanie ma następującą postać:
Przykład nie wymaga chyba szczegółowych wyjaśnień. W warunku LIKE umieszczamy pierwszą literę, a następnie trzy znaki podkreślenia.
Znaki [ i ]
Znaki [ i ] nie są tak powszechnie używane jak znaki % i _. Mało tego, doświadczenie pokazuje, że wiele osób nie jest świadoma ich istnienia. Służą one do określenia zestawu znaków, które mogą znaleźć się na określonej pozycji. Zapis [abc] oznacza, że w danym miejscu może się pojawić litera a, b lub c. Alternatywą jest zapis [a-c], czyli wszystkie znaki od a do c. Najłatwiej przedstawić wszystko na przykładzie.
Zadanie 5. Potrzebujemy wszystkich produktów z tabeli Produkty, które należą do kategorii A1, B1, C1 lub D1.
Rozwiązanie znajduje się poniżej:
--lub alternatywnie
SELECT * FROM Produkty WHERE Kategoria LIKE '[A-D]1'
Naturalnie każde takie kombinacje można ze sobą łączyć. Przeanalizujmy jeszcze jeden przykład:
Zadanie 6. Potrzebujemy wszystkich produktów z tabeli Produkty, które należą do kategorii A1, B1, C1 lub D1 i podkategorii W1 lub W2. Nazwa kategorii zapisana jest w formacie XN.YM, gdzie XN to rodzaj kategorii, a YM to podkategoria.
Przyjrzyjmy się teraz rozwiązaniu tego nieco trudniejszego zadania aprezentowanemu poniżej:
Pierwsze dopasowanie dotyczy litery z zakresu od A do D, po nim następuje cyfra jeden, separator podkategorii, litera W i jedna z dwóch dozwolonych wartości 1 lub 2. Warto zwrócić uwagę na użycie dopasowania grupowego w dwóch miejscach i na dwa sposoby. Pierwsze dopasowanie podane jest w postaci zakresu A-D, drugie natomiast jawnie wskazane jako 1 lub 2 ([12]). Nie należy mylić tego z wyszukiwaniem ciągu znaków 12. Ciąg znaków 12 podawany byłby bez nawiasów kwadratowych.
Negacja znaków, czyli [^ ]
Tworzenie wzorców za pomocą znaków specjalnych jest zagadnieniem dużo bardziej skomplikowanym niż się na początku wydaje. Temat jest tak obszerny, że zostanie pewnie w niedługim czasie rozwinięty. Aby dopełnić przynajmniej zagadnienie nawiasów kwadratowych, warto wspomnieć o znaku negacji w postaci symbolu ^. Przypuśćmy, że mamy takie oto zadanie:
Zadanie 7. Potrzebujemy wszystkich produktów z tabeli Produkty, których podkategoria nie zaczyna się na W. Nazwa kategorii zapisana jest w formacie XN.YM, gdzie XN to rodzaj kategorii, a YM to podkategoria.
Rozwiązanie może wyglądać następująco:
Jak to działa? Bardzo prosto. Kategoria zaczyna się od dwóch dowolnych znaków, po nich następuje kropka, po nich cokolwiek, byle nie W (i tutaj właśnie pojawia się znak negacji). Ostatni znak też jest dowolny. Co istotne, znak negacji może dotyczyć wielu elementów. Jeżeli napiszemy __.[^A-D]_, to otrzymamy wszystkie produkty, których podkategoria nie zaczyna się od liter A, B, C i D.
Podsumowanie i wnioski
Skomplikowanie niektórych wyrażeń może na początku przerażać. Doświadczenie pokazuje jednak, że zdecydowana większość warunków LIKE korzysta tylko z jednego znaku specjalnego, a jest nim najczęściej znak procentu (%). Pozostałe znaki pojawiają się sporadycznie.
W jaki sposób najłatwiej można sobie przyswoić skomplikowane wyrażenia korzystajce z wielu symboli i nawiasów kwadratowych? Poćwiczyć na prostych przykładach i w miarę oswajania się komplikować sobie własnoręcznie wymyślane zadania. Zachęcam do dzielenia się ciekawymi zadaniami w komentarzach.
Kategoria:SQL Server
Komentarze:
"_"
--lub
SELECT * FROM Tabela WHERE Kolumna LIKE '%\_%' ESCAPE '\'
a'b = 'a''b' (a[apostrof]b = a[apostrof][apostrof]b)
8" = '8"' (8[cudzysłów] = 8[cudzysłów])
'AX' = '''AX''' ([apostrof]AX[apostrof] = [apostrof][apostrof]AX[apostrof][apostrof])
Przykład SQL z LIKE:
(VALUES
(1, '''"'''),--apostrof,cudzysłów,apostrof
(2, '''''"'),--apostrof,apostrof,cudzysłów
(3, '"''"')) --cudzysłów,apostrof,cudzysłów
T(ID, Txt)
WHERE Txt LIKE '%''''%'--dwa sąsiednie apostrofy
próbowałem tak ............... AND (v_AlarmEventHistory.Area='PSC%') .......... chciałme użyć ESCAPE ale wtedy zgłasza błąd
A jak napisać szukaj '%' bo mam w tabeli słowa gdzie występuje % i nie wiem jak znaleźć ten znak specjalny.