SQL Server Escape podkreślenie

338

Jak uciec od znaku podkreślenia?

Piszę coś takiego jak klauzula where i chcę być w stanie znaleźć rzeczywiste wpisy z _d na końcu.

Where Username Like '%_d'
GateKiller
źródło

Odpowiedzi:

523

Dokumentacja T-SQL dla LIKE :

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. Poniższa tabela pokazuje kilka przykładów użycia słowa kluczowego LIKE i symboli wieloznacznych [].

W twoim przypadku:

... LIKE '%[_]d'
Lasse V. Karlsen
źródło
o stary! ... jeśli nadal nie działa, upewnij się, że kolumna ma rację.
Jens Frandsen,
198

Oczywiście rozwiązanie @Lasse jest słuszne, ale istnieje inny sposób rozwiązania problemu: operator T-SQL LIKEdefiniuje opcjonalną klauzulę ESCAPE , która pozwala zadeklarować znak, który ucieknie od następnego znaku do wzorca.

W twoim przypadku następujące klauzule WHERE są równoważne:

WHERE username LIKE '%[_]d';            -- @Lasse solution
WHERE username LIKE '%$_d' ESCAPE '$';
WHERE username LIKE '%^_d' ESCAPE '^';
Gerardo Lima
źródło
43
Aby uzupełnić obraz: ESCAPEklauzula jest częścią standardu SQL i będzie działać na dowolnym DBMS, nie tylko SQL Server.
a_horse_w_no_name
2

Te rozwiązania są całkowicie sensowne. Niestety, żadne nie działało dla mnie zgodnie z oczekiwaniami. Zamiast próbować sobie z tym poradzić, zacząłem pracować:

select * from information_schema.columns 
where replace(table_name,'_','!') not like '%!%'
order by table_name
Tek Mailer
źródło
2

To działało dla mnie, po prostu skorzystaj z ucieczki '%\_%'

Arnór Barkarson
źródło
0

Żadne z nich nie działało dla mnie w SSIS v18.0, więc chciałbym zrobić coś takiego:…

WHERE CHARINDEX('_', thingyoursearching) < 1

gdzie staram się ignorować ciągi znaków z podkreśleniem. Jeśli chcesz znaleźć rzeczy, które mają podkreślenie, po prostu odwróć:

WHERE CHARINDEX('_', thingyoursearching) > 0

wolverine87
źródło