LIKE yan tümcesinde köşeli parantezlerden nasıl çıkabilirim?


236

Like kullanarak bir saklı yordam ile öğeleri filtre çalışıyorum. Kolon bir varchartır (15). Filtrelemeye çalıştığım öğelerin adında köşeli ayraçlar var.

Örneğin: WC[R]S123456.

Bunu yaparsam LIKE 'WC[R]S123456'hiçbir şey döndürmez.

ESCAPEAnahtar kelimeyi kullanma hakkında bazı bilgiler buldum , LIKEancak köşeli parantezleri normal bir dize olarak tedavi etmek için nasıl kullanılacağını anlamıyorum.

Yanıtlar:


328
LIKE 'WC[[]R]S123456' 

veya

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

Çalışmalı.


10
Özel bir kaçış karakteri kullanmak istiyorsanız ESCAPE anahtar sözcüğü gerekir (ters eğik çizgi de gerçekten özeldir).
Ryan Kohn

2
Cevabın diğer kısmını da düzelttim. Önceki ve sonraki sürümlerle SQL Fiddle
Martin Smith

10
Köşeli parantezin neden kaçması gerektiğinden emin olmayan biri varsa, LIKE belgeleri bir aralıktaki veya kümedeki tek bir karakteri eşleştirmek için kullanıldığını gösterir. Örneğin, kullanmak LIKE '[fz]oo'hem 'foo' hem de 'zoo' ile eşleşir.
Holistic Developer

3
Cevapta her ikisi için de mantıklı olmak güzel olurdu. Aşağıdaki Amitesh'ın cevabını okuyana kadar ilk örneğin neden işe yarayacağı hemen belli değildi.
Don Jewett

1
LIKE 'WC\[R]S123456' ESCAPE '\'Bakım için daha okunabilir olduğundan tercih edin .
Fire Druid

119

Diyelim ki gerçek ile eşleşmek istiyorsunuz its[brac]et.

Sadece eşlendiğinde ]özel bir anlamı olduğu için kaçmanıza gerek yoktur [.

Bu nedenle kaçmak [sorunu çözmek için yeterlidir. [ Değiştirerek kaçabilirsiniz [[].


7
Bu gerçekten yardımcı oldu ve en iyi cevap imo.
Jared Sol

1
[[]tuhaf görünüyor, ancak ayrıştırıcının perspektifinden baktığınızda mantıklı. Ayrıştırıcı, karakterlerin nasıl işleneceğine ilişkin belirli bir kurala sahiptir [ ]. Yani, metin şu its[brac]etanlama gelir: "Şu ardışık dizeleri bul:, its(köşeli parantezler için kural uygula:) brac, et" . Öte yandan, şu its[[]brac]etanlama gelir: "Şu ardışık dizeleri bul:, its(köşeli parantez için kural uygula:) [, brac]et" .
Brian

28

Ben bir sorgu ile bir alt çizgi ile başlayan isimleri hariç tutmak gerekiyordu, bu yüzden bu ile sona erdi:

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character

2
Bu sürümü kullanmak zorunda kaldım (açıkça "kaçış" karakteri belirterek) - burada diğer cevaplar benim için doğru sonuçları vermedi.
MarcE

20

İşte aslında ne kullandım:

like 'WC![R]S123456' ESCAPE '!'

15

ESCAPE anahtar sözcüğü, normalde joker karakterler olan% ve _ gibi özel karakterleri aramanız gerekirse kullanılır. ESCAPE belirtirseniz, SQL tam anlamıyla% ve _ karakterlerini arar.

İşte birkaç örnek daha içeren iyi bir makale

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

-- or 

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

6

Benim durumumda olduğu gibi '_' (alt çizgi) gibi özel karakterlerden kaçmanız gerekiyorsa ve bir ESCAPE yantümcesi tanımlamak istemiyorsanız / yapamıyorsanız, özel karakteri köşeli parantez içine almak isteyebilirsiniz '[ ' ve '] ' .

Bu, "tuhaf" dizginin anlamını açıklıyor [[] ' - sadece ' [' karakterini köşeli parantezlerle kucaklar , etkili bir şekilde kaçar.

Benim kullanım durumum Profiler için bir filtre kriteri olarak içinde alt çizgiler içeren saklı bir yordamın adını belirtmek oldu. Bu yüzden dizeyi '% name [_] [_] a [_] saklı [_] yordamı%' koydum bir TextData LIKE alanına ve bana ulaşmak istediğim izleme sonuçlarını verdi.

Belgelere iyi bir örnek: LIKE (Transact-SQL) - Joker Karakterleri Değişmez Olarak Kullanma


4

Belgelere göre :

Joker karakter desenini karakterleri değişmez karakterler olarak kullanabilirsiniz. Bir joker karakteri değişmez karakter olarak kullanmak için, joker karakteri parantez içine alın.

Bu üç karakterden kaçmanız gerekiyor %_[:

'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

1

'\' Veya klavyedeki başka bir karakter yerine, klavyede bulunmayan özel karakterleri de kullanabilirsiniz. Kullanım durumunuza bağlı olarak, kullanıcı girişinin yanlışlıkla kaçış karakteri olarak kullanılmasını istemiyorsanız bu gerekli olabilir.


2
Sık sık kullanıyorum ¬- hala İngiltere'de bir klavye karakteri ama nadiren bilerek kullanıldı :) ( Escve sol üst arasında Tab)
Andi Mohr

Kullanıcılar yine de klavyede bulunmayan harfler içeren veriler gönderebilir. Bu cevap şüpheli bir şekilde sorunun çözülmesini önlemek için bir öneri gibi geliyor…
binki

0

Aşağıdaki kullanın.

Kullanıcı girdisinin olduğu gibi arama yapması için, tüm özel karakterlerin (aşağıda tüm SQL Server'ı kapsar) değiştirilmesini gerektireceği şekilde escape kullanın.

Burada tek tırnak işareti '' "bir dize birleştirme meselesi olduğu için yantümceyi etkilemediğinden alınmaz.

"[" 'den kaçtığımız için "-" & "^" & "]" değiştirme gerekli değildir.

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

Ardından, SQL Query'de aşağıdaki gibi olmalıdır. (Parametreli sorguda dize, yukarıdaki değiştirmeden sonra desenlerle eklenebilir).

Tam dizeyi aramak için.

like 'FormattedString' ESCAPE 'ð'

Dizeyle başlamak için

like '%FormattedString' ESCAPE 'ð'

Dize ile bitirmek için

like 'FormattedString%' ESCAPE 'ð'

Dizeyle içeren aramayı aramak için

like '%FormattedString%' ESCAPE 'ð'

ve böylece diğer desen eşleştirme için. Ancak doğrudan kullanıcı girdisinin yukarıda belirtildiği gibi biçimlendirilmesi gerekir.


0

Bu sırada bir sorun var:

LIKE 'WC[[]R]S123456' 

ve:

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

Her ikisi de SQL Server için çalışıyor, ancak ikisi de Oracle için çalışmıyor.

Sol küme ayracı içeren bir deseni tanımanın ISO / IEC 9075 yolu yok gibi görünüyor.

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.