Jak mogę uniknąć nawiasów kwadratowych w klauzuli LIKE?

236

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 ESCAPEsłowa kluczowego, LIKEale nie rozumiem, jak używać go do traktowania nawiasów kwadratowych jako zwykłego ciągu.

Travis
źródło

Odpowiedzi:

328
LIKE 'WC[[]R]S123456' 

lub

LIKE 'WC\[R]S123456' ESCAPE '\'

Powinno działać.

Otávio Décio
źródło
10
Słowo kluczowe ESCAPE jest wymagane, jeśli chcesz użyć niestandardowego znaku zmiany znaczenia (odwrotny ukośnik jest rzeczywiście niestandardowy).
Ryan Kohn
2
Poprawiłem także drugą część odpowiedzi. SQL Fiddle z wersjami przed i po
Martin Smith
10
Jeśli ktoś nie jest pewny, dlaczego nawias kwadratowy musi być poprzedzony znakiem ucieczki, dokumentacja LIKE wskazuje, że jest on używany do dopasowania pojedynczego znaku w zakresie lub zestawie. Na przykład użycie LIKE '[fz]oo'spowoduje dopasowanie zarówno „foo”, jak i „zoo”.
Holistic Developer
3
Byłoby miło mieć uzasadnienie dla obu tych odpowiedzi. Nie od razu zrozumiałem, dlaczego pierwszy przykład zadziała, dopóki nie przeczytam odpowiedzi Amitesh poniżej.
Don Jewett
1
Wolę, LIKE 'WC\[R]S123456' ESCAPE '\'ponieważ jest bardziej czytelny do konserwacji.
Fire Druid,
119

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 [[] .

Amitesh
źródło
7
To było naprawdę pomocne i imo najlepsza odpowiedź.
Jared Sol
1
[[]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 tekst its[brac]etoznacza: „Znajdź następujące ciągi:, its(zastosuj regułę w nawiasach kwadratowych:) brac, et . Z drugiej strony its[[]brac]etoznacza: „Znajdź następujące ciągi:, its(zastosuj regułę w nawiasach kwadratowych:) [, brac]et .
Brian
28

Musiałem wykluczyć z zapytania nazwy zaczynające się znakiem podkreślenia, więc skończyłem na tym:

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character
Andrew Backer
źródło
2
Musiałem użyć tej wersji (wyraźnie określając znak „ucieczki”) - inne odpowiedzi tutaj nie dały mi poprawnych wyników.
MarcE
20

Oto, czego faktycznie użyłem:

like 'WC![R]S123456' ESCAPE '!'
Travis
źródło
15

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

SELECT columns FROM table WHERE 
    column LIKE '%[[]SQL Server Driver]%' 

-- or 

SELECT columns FROM table WHERE 
    column LIKE '%\[SQL Server Driver]%' ESCAPE '\'
Scott
źródło
6

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

ssurba
źródło
4

Według dokumentacji :

Możesz używać znaków pasujących do wzoru wieloznacznego jako literalnych znaków. Aby użyć znaku wieloznacznego jako literału, umieść go w nawiasach.

Musisz uciec przed tymi trzema postaciami %_[:

'5%'      LIKE '5[%]'      -- true
'5$'      LIKE '5[%]'      -- false
'foo_bar' LIKE 'foo[_]bar' -- true
'foo$bar' LIKE 'foo[_]bar' -- false
'foo[bar' LIKE 'foo[[]bar' -- true
'foo]bar' LIKE 'foo]bar'   -- true
Salman A.
źródło
1

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.

Rob Breidecker
źródło
2
Często używam ¬- wciąż jest to znak klawiatury w Wielkiej Brytanii, ale rzadko używany świadomie :) (górny lewy pomiędzy Esci Tab)
Andi Mohr
Użytkownicy nadal mogą przesyłać dane zawierające litery, których nie ma na klawiaturze. Ta odpowiedź brzmi podejrzanie jak sugestia, aby uniknąć faktycznego rozwiązania problemu…
binki,
0

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 „[”.

String FormattedString = "UserString".Replace("ð","ðð").Replace("_", "ð_").Replace("%", "ð%").Replace("[", "ð[");

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.

like 'FormattedString' ESCAPE 'ð'

Aby rozpocząć wyszukiwanie, wpisz ciąg

like '%FormattedString' ESCAPE 'ð'

Aby wyszukać, zakończ ciągiem

like 'FormattedString%' ESCAPE 'ð'

Aby wyszukać zawierają ciąg

like '%FormattedString%' ESCAPE 'ð'

i tak dalej w przypadku innego dopasowania wzorca. Ale bezpośrednie dane wejściowe użytkownika muszą zostać sformatowane, jak wspomniano powyżej.

Anonimowy Stwórca
źródło
0

Problem polega na tym, że:

LIKE 'WC[[]R]S123456' 

i:

LIKE 'WC\[R]S123456' ESCAPE '\'

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ę.

questaware
źródło