Próbuję filtrować elementy za pomocą procedury składowanej przy użyciu funkcji like. Kolumna jest varchar (15). Elementy, które próbuję filtrować, mają nawiasy kwadratowe w nazwie.
Na przykład: WC[R]S123456
.
Jeśli to zrobię, LIKE 'WC[R]S123456'
nic nie zwróci.
Znalazłem trochę informacji na temat używania ESCAPE
słowa kluczowego, LIKE
ale nie rozumiem, jak używać go do traktowania nawiasów kwadratowych jako zwykłego ciągu.
LIKE '[fz]oo'
spowoduje dopasowanie zarówno „foo”, jak i „zoo”.LIKE 'WC\[R]S123456' ESCAPE '\'
ponieważ jest bardziej czytelny do konserwacji.Powiedzmy, że chcesz dopasować dosłowność
its[brac]et
.Nie musisz uciekać,
]
ponieważ ma specjalne znaczenie tylko wtedy, gdy jest sparowany[
.Dlatego ucieczka
[
wystarczy, aby rozwiązać problem. Możesz uciec[
, zastępując go[[]
.źródło
[[]
wygląda dziwnie, ale ma sens, gdy spojrzy się na niego z perspektywy parsera. Analizator składni ma określoną regułę dotyczącą obsługi znaków pomiędzy[ ]
. Tak więc tekstits[brac]et
oznacza: „Znajdź następujące ciągi:,its
(zastosuj regułę w nawiasach kwadratowych:)brac
,et
” . Z drugiej stronyits[[]brac]et
oznacza: „Znajdź następujące ciągi:,its
(zastosuj regułę w nawiasach kwadratowych:)[
,brac]et
” .Musiałem wykluczyć z zapytania nazwy zaczynające się znakiem podkreślenia, więc skończyłem na tym:
źródło
Oto, czego faktycznie użyłem:
źródło
Słowo kluczowe ESCAPE jest używane, jeśli chcesz wyszukać znaki specjalne, takie jak% i _, które zwykle są symbolami wieloznacznymi. Jeśli podasz ESCAPE, SQL będzie szukał dosłownie znaków% i _.
Oto dobry artykuł z kilkoma innymi przykładami
źródło
Jeśli potrzebujesz znaków specjalnych, takich jak „_” (podkreślenie), tak jak w moim przypadku, i nie chcesz / nie możesz zdefiniować klauzuli ESCAPE, możesz umieścić znak specjalny w nawiasach kwadratowych ”[ „ i ”] .
To wyjaśnia znaczenie „dziwnego” ciągu „[[]” - po prostu obejmuje znak „[” nawiasami kwadratowymi, skutecznie go unikając.
Mój przypadek użycia polegał na podaniu nazwy procedury składowanej z podkreśleniami jako kryterium filtrowania dla programu Profiler. Więc umieściłem ciąg „% name [_] z [_] [_] przechowywanej [_] procedury% ' w polu LIKE TextData i dało mi to wyniki śledzenia, które chciałem osiągnąć.
Oto dobry przykład z dokumentacji: LIKE (Transact-SQL) - Używanie znaków wieloznacznych jako literałów
źródło
Według dokumentacji :
Musisz uciec przed tymi trzema postaciami
%_[
:źródło
Zamiast „\” lub innego znaku na klawiaturze można także używać znaków specjalnych, których nie ma na klawiaturze. W zależności od przypadku użycia może to być konieczne, jeśli nie chcesz, aby dane użytkownika zostały przypadkowo użyte jako znak zmiany znaczenia.
źródło
¬
- wciąż jest to znak klawiatury w Wielkiej Brytanii, ale rzadko używany świadomie :) (górny lewy pomiędzyEsc
iTab
)Użyj następujących.
Aby dane wejściowe użytkownika były wyszukiwane w obecnej postaci, użyj klawisza Escape, ponieważ będzie wymagało następującej zamiany wszystkich znaków specjalnych (poniżej obejmuje cały SQL Server).
Tutaj pojedynczy cytat „” nie jest brany, ponieważ nie wpływa na klauzulę, ponieważ jest to kwestia łączenia łańcuchów.
Zastąpienie „-” i „^” i „]” nie jest wymagane, ponieważ uciekamy przed „[”.
Następnie w zapytaniu SQL powinno wyglądać następująco. (W sparametryzowanym zapytaniu łańcuch można dodać ze wzorami po powyższej zamianie).
Aby wyszukać dokładny ciąg.
Aby rozpocząć wyszukiwanie, wpisz ciąg
Aby wyszukać, zakończ ciągiem
Aby wyszukać zawierają ciąg
i tak dalej w przypadku innego dopasowania wzorca. Ale bezpośrednie dane wejściowe użytkownika muszą zostać sformatowane, jak wspomniano powyżej.
źródło
Problem polega na tym, że:
i:
Oba działają dla SQL Server, ale żadne nie działa dla Oracle.
Wydaje się, że nie ma sposobu ISO / IEC 9075 na rozpoznanie wzoru obejmującego lewą klamrę.
źródło