Bagaimana saya bisa keluar kurung kotak dalam klausa LIKE?

237

Saya mencoba memfilter item dengan prosedur tersimpan menggunakan like. Kolom adalah varchar (15). Item yang saya coba filter memiliki tanda kurung kotak dalam namanya.

Sebagai contoh: WC[R]S123456.

Jika saya melakukan LIKE 'WC[R]S123456'itu tidak akan mengembalikan apa pun.

Saya menemukan beberapa informasi tentang menggunakan ESCAPEkata kunci dengan LIKEtetapi saya tidak mengerti bagaimana menggunakannya untuk memperlakukan tanda kurung sebagai string biasa.

Travis
sumber

Jawaban:

329
LIKE 'WC[[]R]S123456' 

atau

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

Harus bekerja

Otávio Décio
sumber
10
Kata kunci ESCAPE diperlukan jika Anda ingin menggunakan karakter pelarian khusus (garis miring terbalik memang khusus).
Ryan Kohn
2
Saya mengoreksi bagian lain dari jawaban juga. SQL Fiddle dengan versi sebelum dan sesudah
Martin Smith
10
Jika ada yang tidak jelas mengapa braket perlu diloloskan, dokumentasi untuk LIKE mengindikasikan bahwa braket tersebut digunakan untuk mencocokkan satu karakter dalam rentang atau set. Misalnya, menggunakan LIKE '[fz]oo'akan cocok dengan 'foo' dan 'zoo'.
Pengembang Holistik
3
Akan menyenangkan untuk memiliki alasan untuk keduanya dalam jawabannya. Tidak segera jelas bagi saya mengapa contoh pertama akan berhasil sampai saya membaca jawaban dari Amitesh di bawah ini.
Don Jewett
1
Lebih suka LIKE 'WC\[R]S123456' ESCAPE '\'karena lebih mudah dibaca untuk pemeliharaan.
Fire Druid
119

Katakanlah Anda ingin mencocokkan literal its[brac]et.

Anda tidak perlu melarikan diri ]karena memiliki makna khusus hanya ketika dipasangkan dengannya [.

Oleh karena itu melarikan diri [sudah cukup untuk menyelesaikan masalah. Anda dapat melarikan diri [ dengan menggantinya dengan [[] .

Amitesh
sumber
7
Ini sangat membantu dan merupakan jawaban terbaik.
Jared Sol
1
[[]memang terlihat aneh, tetapi masuk akal ketika Anda melihatnya dari perspektif parser. Parser memiliki aturan khusus untuk bagaimana menangani karakter di antaranya [ ]. Jadi, teks its[brac]etberarti: "Temukan string berurutan berikut:, its(terapkan aturan untuk tanda kurung siku:) brac, et" . Di sisi lain, its[[]brac]etberarti: "Temukan string berurutan berikut:, its(terapkan aturan untuk tanda kurung:) [, brac]et" .
Brian
28

Saya perlu mengecualikan nama yang dimulai dengan garis bawah dari kueri, jadi saya berakhir dengan ini:

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character
Andrew Backer
sumber
2
Saya harus menggunakan versi ini (menentukan karakter "pelarian" secara eksplisit) - jawaban lain di sini tidak memberikan hasil yang benar untuk saya.
MarcE
20

Inilah yang sebenarnya saya gunakan:

like 'WC![R]S123456' ESCAPE '!'
Travis
sumber
15

Kata kunci ESCAPE digunakan jika Anda perlu mencari karakter khusus seperti% dan _, yang biasanya kartu liar. Jika Anda menentukan ESCAPE, SQL akan mencari karakter% dan _ secara harfiah.

Inilah artikel bagus dengan beberapa contoh lagi

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

-- or 

SELECT columns FROM table WHERE 
    column LIKE '%\[SQL Server Driver]%' ESCAPE '\'
scottm
sumber
6

Jika Anda perlu keluar dari karakter khusus seperti '_' (garis bawah), seperti dalam kasus saya, dan Anda tidak mau / tidak dapat mendefinisikan klausa ESCAPE, Anda mungkin ingin menyertakan karakter khusus dengan tanda kurung siku '[[ ' dan '] ' .

Ini menjelaskan arti dari string "aneh" '[[]' - itu hanya merangkul karakter '[' dengan tanda kurung siku, secara efektif menghindarinya.

Kasus penggunaan saya adalah untuk menentukan nama prosedur yang tersimpan dengan garis bawah di dalamnya sebagai kriteria filter untuk Profiler. Jadi saya telah meletakkan string '% name [_] dari [_] a [_] tersimpan [_] prosedur%' dalam bidang LIKE TextData dan itu memberi saya hasil penelusuran yang ingin saya capai.

Berikut ini adalah contoh yang baik dari dokumentasi: LIKE (Transact-SQL) - Menggunakan Karakter Wildcard Sebagai Literal

ssurba
sumber
4

Menurut dokumentasi :

Anda dapat menggunakan karakter yang cocok dengan wildcard sebagai karakter literal. Untuk menggunakan karakter wildcard sebagai karakter literal, lampirkan karakter wildcard dalam tanda kurung.

Anda perlu melarikan diri dari tiga karakter ini %_[:

'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
sumber
1

Alih-alih '\' atau karakter lain di keyboard, Anda juga dapat menggunakan karakter khusus yang tidak ada di keyboard. Tergantung pada kasus penggunaan Anda, ini mungkin diperlukan, jika Anda tidak ingin input pengguna secara tidak sengaja digunakan sebagai karakter pelarian.

Rob Breidecker
sumber
2
Saya sering menggunakan ¬- itu masih karakter keyboard di Inggris tetapi jarang digunakan dengan sengaja :) (kiri atas antara Escdan Tab)
Andi Mohr
Pengguna masih dapat mengirimkan data yang mengandung huruf yang tidak ada di keyboard. Jawaban ini kedengarannya seperti saran yang mencurigakan agar tidak benar-benar menyelesaikan masalah ...
binki
0

Gunakan Mengikuti.

Untuk input pengguna untuk mencari apa adanya, gunakan escape, karena akan membutuhkan penggantian berikut untuk semua karakter khusus (di bawah ini mencakup semua SQL Server).

Di sini kutipan tunggal "'" tidak diambil karena tidak mempengaruhi klausa seperti karena ini adalah masalah penggabungan string.

"-" & "^" & "]" ganti tidak diperlukan karena kami melarikan diri "[".

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

Kemudian, dalam SQL Query seharusnya sebagai berikut. (Dalam kueri parameterised, string dapat ditambahkan dengan pola setelah penggantian di atas).

Untuk mencari string yang tepat.

like 'FormattedString' ESCAPE 'ð'

Untuk mencari mulai dengan string

like '%FormattedString' ESCAPE 'ð'

Untuk mencari akhir dengan string

like 'FormattedString%' ESCAPE 'ð'

Untuk mencari mengandung dengan string

like '%FormattedString%' ESCAPE 'ð'

dan seterusnya untuk pencocokan pola lainnya. Tetapi input pengguna langsung perlu format seperti yang disebutkan di atas.

Pencipta Anonim
sumber
0

Ada masalah saat itu:

LIKE 'WC[[]R]S123456' 

dan:

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

Keduanya bekerja untuk SQL Server tetapi tidak untuk Oracle.

Tampaknya tidak ada cara ISO / IEC 9075 untuk mengenali pola yang melibatkan penjepit kiri.

sadar pencarian
sumber