SQL LIKE yan tümcesi için özel karakterlerin listesi


119

Bir SQL için tüm özel karakterlerin tam listesi nedir (SQL Server ile ilgileniyorum ama diğerlerininki de iyi olurdu) LIKE cümlesi?

Örneğin

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

SQL Sunucusu :

  1. %
  2. _
  3. [belirtici] Ör. [az]
  4. [^ Belirteci]
  5. ESCAPE yan tümcesi Ör.% 30! %% 'ESCAPE'! ' % 30'u doğru olarak değerlendirecek
  6. 'Karakterlerden' Örneğin, onlar oluyor 'ile kaçılmalıdırlar.

MySQL:

  1. % - Sıfır veya daha fazla karakterden oluşan herhangi bir dize.
  2. _ - Herhangi bir tek karakter
  3. ESCAPE yan tümcesi Ör.% 30! %% 'ESCAPE'! ' % 30'u doğru olarak değerlendirecek

Oracle:

  1. % - Sıfır veya daha fazla karakterden oluşan herhangi bir dize.
  2. _ - Herhangi bir tek karakter
  3. ESCAPE yan tümcesi Ör.% 30! %% 'ESCAPE'! ' % 30'u doğru olarak değerlendirecek

Sybase

  1. %
  2. _
  3. [belirtici] Ör. [az]
  4. [^ Belirteci]

İlerleme:

  1. % - Sıfır veya daha fazla karakterden oluşan herhangi bir dize.
  2. _ - Herhangi bir tek karakter

    Başvuru Kılavuzu burada [PDF]

PostgreSQL:

  1. % - Sıfır veya daha fazla karakterden oluşan herhangi bir dize.
  2. _ - Herhangi bir tek karakter
  3. ESCAPE yan tümcesi Ör.% 30! %% 'ESCAPE'! ' % 30'u doğru olarak değerlendirecek

ANSI SQL92:

  1. %
  2. _
  3. Yalnızca belirtilmişse ESCAPE karakteri .

PostgreSQL ayrıca SIMILAR TOaşağıdakileri ekleyen operatöre sahiptir:

  1. [specifier]
  2. [^specifier]
  3. | - iki seçenekten biri
  4. * - önceki öğenin sıfır veya birkaç kez tekrarı.
  5. + - önceki öğenin bir veya daha fazla kez tekrarlanması.
  6. () - öğeleri birlikte gruplandırın

Buradaki fikir, bunu bunun için "Tek durak noktası" haline gelebilecek bir topluluk Wiki'si yapmaktır.


ESCAPE hükmünden bahsetmeye değer. SQL Server, Oracle ve MySQL hepsi bunu destekler. Sybase hakkında bilmiyorum.
Dave Webb

Şimdi ESCAPE deyimi böylece muhtemelen sadece bir kez söz ihtiyacı standart SQL olduğunu düşünüyorum
Dave Webb

Listelenen tüm sunucularda (ve daha sonra eklenebilecek olanlarda) uygulandığını kendim bilmiyorum, bu yüzden onu bir "Tüm destek" bölümüne çekmeye isteksizim. Hepsinin desteklendiğinden eminseniz, devam edin.
Jonathan Parker

Kaçış karakterinin kendisinden kaçmayı unutmayın ...
Christoffer Hammarström

İki yorum. İlk olarak, Microsoft SQL başlangıçta Sybase'den gelir, bu nedenle benzerlik tesadüfi değildir. İkincisi, tek bir alıntıdan bir başkasıyla kaçmak, bunlarla sınırlı değildir LIKE; örneğin WHERE familyname = 'O''Toole'. Üçüncüsü, SIMILAR TOoperatör kendi özelliklerine (ve daha birçok özel karaktere) sahip bir tür hibrit düzenli ifade sunar, bu nedenle muhtemelen buraya dahil edilmemelidir. Sanırım bu 3 yorum yapıyor ama kimse İspanyol Engizisyonu'nu beklemiyor.
Manngo

Yanıtlar:


22

SQL Server için http://msdn.microsoft.com/en-us/library/ms179859.aspx adresinden :

  • % Sıfır veya daha fazla karakterden oluşan herhangi bir dizge.

    WHERE title LIKE '%computer%' kitap başlığının herhangi bir yerinde 'bilgisayar' kelimesini içeren tüm kitap başlıklarını bulur.

  • _ Herhangi bir tek karakter.

    WHERE au_fname LIKE '_ean' ean ile biten dört harfli tüm ilk adları bulur (Dean, Sean vb.).

  • [] Belirtilen aralıktaki ([af]) veya küme ([abcdef]) içindeki herhangi bir tek karakter.

    WHERE au_lname LIKE '[C-P]arsen'arsen ile biten ve C ile P arasında herhangi bir tek karakterle başlayan yazar soyadlarını bulur, örneğin Carsen, Larsen, Karsen, vb. Aralık aramalarında, aralığa dahil olan karakterler harmanlamanın sıralama kurallarına bağlı olarak değişebilir.

  • [^] Belirtilen aralık ([^ af]) veya küme ([^ abcdef]) dahilinde olmayan herhangi bir tek karakter.

    WHERE au_lname LIKE 'de[^l]%' de ile başlayan ve sonraki harfin l olmadığı tüm yazarların soyadları.


1
Sadece denedim ve yapabileceğin gibi görünüyor. Ama normal ifadeler gibi değil => [0-9] Bunun yerine her karakteri şu şekilde belirtmeniz gerekiyor: [0123456789]
Çağdaş Tekin

3
Bekle hayır. RegEx'e benzer, dolayısıyla [0-9] da çalışır. Karışıklık için özür dilerim.
Çağdaş Tekin

6

ANSI SQL92 :

  • %
  • _
  • bir ESCAPE karakteri yalnızca belirtilmişse .

Birçok veritabanının standart kurallara bağlı kalmaması ve fazladan karakterler eklememesi veya eksik olduğunda ESCAPE'yi varsayılan '\' değeriyle hatalı şekilde etkinleştirmesi hayal kırıklığı yaratıyor. Sanki '\' ile yeterince sorunumuz yokmuş gibi!

Burada DBMS'den bağımsız kod yazmak imkansız çünkü hangi karakterlerden kaçmanız gerektiğini bilmiyorsunuz ve standart, kaçmanız gerekmeyen şeylerden kaçamayacağınızı söylüyor. (Bkz. Bölüm 8.5 / Genel Kurallar / 3.a.ii.)

Teşekkürler SQL! gnnn


5

SQL Server'da fazladan bir 'mevcuttan kaçmak için' eklemeniz gerektiğini eklemelisiniz:

smith's -> smith's


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

SQL Server için olası yanıt

İlginç olan LinqPad'i SQL Server ile kullanarak bir test yaptım, bu sadece altında Linq to SQL çalıştırıyor ve aşağıdaki SQL ifadesini oluşturuyor.

Kayıtlar .Where (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 '~'

Bu yüzden henüz test etmedim, ancak görünüşe göre ESCAPE '~'anahtar kelime, benzer bir ifadede kullanılmak üzere bir dizenin otomatik olarak kaçmasına izin verebilir.


Muhtemelen kullanıyorlar ESCAPEçünkü üç karakter yerine kaçan karakter başına iki karakter (örneğin %olur ~%) kullanılmasına izin veriyor (örneğin, olmadan ESCAPE, %olur [%]).
binki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.