Daftar karakter khusus untuk klausa SQL LIKE


119

Apa daftar lengkap dari semua karakter khusus untuk SQL (Saya tertarik dengan SQL Server tetapi yang lain juga bagus) klausa LIKE?

Misalnya

SELECT Name FROM Person WHERE Name LIKE '%Jon%'

SQL Server :

  1. %
  2. _
  3. [penentu] Misalnya [az]
  4. [^ penentu]
  5. Klausa ESCAPE Misalnya% 30! %% 'ESCAPE'! ' akan menilai 30% sebagai benar
  6. 'karakter harus dihilangkan dengan' Misalnya mereka menjadi mereka '

MySQL:

  1. % - String apa pun yang berisi nol atau lebih karakter.
  2. _ - Karakter tunggal apa pun
  3. Klausa ESCAPE Misalnya% 30! %% 'ESCAPE'! ' akan menilai 30% sebagai benar

Peramal:

  1. % - String apa pun yang berisi nol atau lebih karakter.
  2. _ - Karakter tunggal apa pun
  3. Klausa ESCAPE Misalnya% 30! %% 'ESCAPE'! ' akan menilai 30% sebagai benar

Sybase

  1. %
  2. _
  3. [penentu] Misalnya [az]
  4. [^ penentu]

Kemajuan:

  1. % - String apa pun yang berisi nol atau lebih karakter.
  2. _ - Karakter tunggal apa pun

    Panduan Referensi di sini [PDF]

PostgreSQL:

  1. % - String apa pun yang berisi nol atau lebih karakter.
  2. _ - Karakter tunggal apa pun
  3. Klausa ESCAPE Misalnya% 30! %% 'ESCAPE'! ' akan menilai 30% sebagai benar

ANSI SQL92:

  1. %
  2. _
  3. Karakter ESCAPE hanya jika ditentukan .

PostgreSQL juga memiliki SIMILAR TOoperator yang menambahkan berikut ini:

  1. [specifier]
  2. [^specifier]
  3. | - salah satu dari dua alternatif
  4. * - pengulangan item sebelumnya sebanyak nol atau lebih.
  5. + - pengulangan item sebelumnya satu kali atau lebih.
  6. () - kelompokkan item bersama

Idenya adalah menjadikan ini Wiki komunitas yang bisa menjadi "toko serba ada" untuk ini.


Mungkin ada baiknya menyebutkan klausul ESCAPE. SQL Server, Oracle dan MySQL semuanya mendukung ini. Tidak tahu tentang Sybase.
Dave Webb

Saya berpikir sekarang klausa ESCAPE adalah SQL standar jadi mungkin hanya perlu disebutkan sekali
Dave Webb

Saya sendiri tidak tahu bahwa ini diterapkan di semua server yang terdaftar (dan semua yang mungkin ditambahkan nanti) jadi saya enggan untuk menariknya ke bagian "Semua dukungan". Jika Anda yakin bahwa mereka semua didukung, lanjutkan.
Jonathan Parker

Jangan lupa untuk melarikan diri dari karakter pelarian itu sendiri ...
Christoffer Hammarström

Dua komentar. Pertama, Microsoft SQL awalnya berasal dari Sybase, jadi kemiripannya tidak kebetulan. Kedua, menyela satu kutipan dengan yang lain tidak terbatas pada LIKE; misalnya WHERE familyname = 'O''Toole'. Ketiga, SIMILAR TOoperator memperkenalkan semacam ekspresi reguler hibrida, yang memiliki fiturnya sendiri (dan banyak lagi karakter khusus), jadi mungkin sebaiknya tidak disertakan di sini. Saya kira itu membuat 3 komentar, tapi tidak ada yang mengharapkan Inkuisisi Spanyol.
Manngo

Jawaban:


22

Untuk SQL Server, dari http://msdn.microsoft.com/en-us/library/ms179859.aspx :

  • % Semua string dari nol atau lebih karakter.

    WHERE title LIKE '%computer%' menemukan semua judul buku dengan kata 'komputer' di mana saja di judul buku.

  • _ Karakter tunggal apa pun.

    WHERE au_fname LIKE '_ean' menemukan semua nama depan empat huruf yang diakhiri dengan ean (Dean, Sean, dan seterusnya).

  • [] Setiap karakter tunggal dalam rentang yang ditentukan ([af]) atau set ([abcdef]).

    WHERE au_lname LIKE '[C-P]arsen'menemukan nama belakang penulis yang diakhiri dengan arsen dan dimulai dengan karakter tunggal antara C dan P, misalnya Carsen, Larsen, Karsen, dan seterusnya. Dalam pencarian kisaran, karakter yang termasuk dalam kisaran dapat bervariasi tergantung pada aturan penyortiran dari penyusunan.

  • [^] Setiap karakter tunggal tidak dalam rentang yang ditentukan ([^ af]) atau set ([^ abcdef]).

    WHERE au_lname LIKE 'de[^l]%' semua nama belakang penulis dimulai dengan de dan tidak ada huruf berikutnya l.


1
Saya baru saja mencoba dan sepertinya Anda bisa. Tapi ini tidak seperti ekspresi reguler => [0-9] Sebaliknya Anda perlu menentukan setiap karakter seperti ini: [0123456789]
Çağdaş Tekin

3
Tunggu, tidak. Ini seperti RegEx jadi [0-9] juga berfungsi. Maaf bila membingungkan.
Çağdaş Tekin

6

ANSI SQL92 :

  • %
  • _
  • karakter ESCAPE hanya jika ditentukan .

Sangat mengecewakan bahwa banyak database yang tidak mematuhi aturan standar dan menambahkan karakter tambahan, atau salah mengaktifkan ESCAPE dengan nilai default '\' jika tidak ada. Sepertinya kita belum memiliki cukup masalah dengan '\'!

Tidak mungkin untuk menulis kode yang tidak tergantung DBMS di sini, karena Anda tidak tahu karakter apa yang akan Anda hindari, dan standar mengatakan Anda tidak dapat melarikan diri dari hal-hal yang tidak perlu di-escape. (Lihat bagian 8.5 / Aturan Umum / 3.a.ii.)

Terima kasih SQL! gnnn


5

Anda harus menambahkan bahwa Anda harus menambahkan 'untuk menghindari exising' di SQL Server:

smith's -> smith ''


1

Sybase:

%              : Matches any string of zero or more characters.
_              : Matches a single character.
[specifier]    : Brackets enclose ranges or sets, such as [a-f] 
                 or [abcdef].Specifier  can take two forms:

                 rangespec1-rangespec2: 
                   rangespec1 indicates the start of a range of characters.
                   - is a special character, indicating a range.
                   rangespec2 indicates the end of a range of characters.

                 set: 
                  can be composed of any discrete set of values, in any 
                  order, such as [a2bR].The range [a-f], and the 
                  sets [abcdef] and [fcbdae] return the same 
                  set of values.

                 Specifiers are case-sensitive.

[^specifier]    : A caret (^) preceding a specifier indicates 
                  non-inclusion. [^a-f] means "not in the range 
                  a-f"; [^a2bR] means "not a, 2, b, or R."

0

Jawaban potensial untuk SQL Server

Menarik Saya baru saja menjalankan tes menggunakan LinqPad dengan SQL Server yang seharusnya hanya menjalankan Linq ke SQL di bawahnya dan itu menghasilkan pernyataan SQL berikut.

Rekaman. Dimana (r => r.Name.Contains ("lkjwer --_ ~ []"))

-- Region Parameters
DECLARE @p0 VarChar(1000) = '%lkjwer--~_~~~[]%'
-- EndRegion
SELECT [t0].[ID], [t0].[Name]
FROM [RECORDS] AS [t0]
WHERE [t0].[Name] LIKE @p0 ESCAPE '~'

Jadi saya belum mengujinya tetapi sepertinya ESCAPE '~'kata kunci berpotensi memungkinkan pelolosan string secara otomatis untuk digunakan dalam ekspresi serupa.


Mereka mungkin hanya menggunakan ESCAPEkarena memungkinkan penggunaan dua karakter per karakter yang diloloskan (misalnya, %menjadi ~%) alih-alih tiga (misalnya, tanpa ESCAPE, %menjadi [%]).
binki
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.