Bir LIKE filtresinde Alt Çizgi karakteri kullanmak neden bana tüm sonuçları veriyor?


118

Aşağıdaki SQL sorgusunu bir LIKEkoşulla yazdım :

SELECT * FROM Manager
WHERE managerid LIKE '_%'
AND managername LIKE '%_%'

Gelen LIKEherhangi çizgi aramak istediğiniz %_%, ama benim sütun veri yok çizgi karakterleri olduğunu biliyoruz.

  • Sorgu neden bana tablodaki tüm kayıtları veriyor?

Örnek veri:

create table Manager(
    id int
    ,managerid varchar(3)
    ,managername varchar(50)
    );

insert into Manager(id,managerid,managername)values(1,'A1','Mangesh');
insert into Manager(id,managerid,managername)values(2,'A2','Sagar');
insert into Manager(id,managerid,managername)values(3,'C3','Ahmad');
insert into Manager(id,managerid,managername)values(4,'A4','Mango');
insert into Manager(id,managerid,managername)values(5,'B5','Sandesh');

Sql-Fiddle


1
Bir sql-fiddle sorgusu eklemek güzel, ancak sorguyu her zaman SO'da düz metin olarak göstermelisiniz. Aksi takdirde bu soru bağlantı çürümesine karşı savunmasızdır .
Tim SCHMELTER

_ :: Tek bir karakterin
yedeği

Yanıtlar:


193

Durumunuzu şu şekilde değiştirin WHERE:

WHERE mycolumn LIKE '%\_%' ESCAPE '\'

Bu, Oracle'ın kaçış karakterlerini destekleme yollarından biridir. Burada kaçış karakterini escapeanahtar kelimeyle tanımlarsınız . Ayrıntılar için Oracle Docs'daki bu bağlantıya bakın .

'_'Ve '%'bir de joker olan LIKESQL işletilen açıklamada.

_Karakter (herhangi bir) tek bir karakter varlığı arar. Eğer arama varsa columnName LIKE '_abc', bu satırlar sahip sonuçlanır verecek 'aabc', 'xabc', '1abc', '#abc'ama DEĞİL 'abc', 'abcc', 'xabcd'vb.

'%'Karakter karakter 0 veya daha fazla sayıda eşleştirme için kullanılmaktadır. Eğer arama Yani, demektir columnName LIKE '%abc', bu sahip sen neden verecektir 'abc', 'aabc', 'xyzabc've benzeri, ancak hiçbir 'xyzabcd', 'xabcdd've bitmez başka bir dize 'abc'.

Senin durumunda aradın '%_%'. Bu, o sütunun bir veya daha fazla karaktere sahip olduğu tüm satırları, yani herhangi bir karakteri, değeri olarak verecektir. Bu nedenle _sütun değerlerinizde hiç olmamasına rağmen tüm satırları alıyorsunuz .


Erişim Db'de de aynı sorunla karşılaşıyorum. lütfen bana bu sorunu nasıl çözebileceğimi söyleyin.

Belki de 'erişim db'deki joker karakterler' için Google'ı kullanabilirsiniz. Access üzerinde hiç çalışmadım, bu yüzden sana bu konuda yardımcı olamam. Access'in likeoperatörü desteklediğinden bile şüpheliyim . Çözümüm tüm veritabanlarında olmasa da çoğu veritabanında çalışacaktır.
Rachcha

2
Burada belirtilmeyen şey, bunun SQL Server'da da çalıştığıdır - bu da başlangıçta OP'nin soruyu SQL Server için etiketlediklerinde Oracle SQL için bir cevabı kabul etmesine neden oldu. En azından cevap, öncelikle etiketlenmiş DBMS'yi hedefleyecek şekilde yazılmalıdır.
underscore_d

87

Alt çizgi, rastgele bir karakter için birLIKE sorgudaki joker karakterdir.

Bu nedenle LIKE %_%, "bana bu sütunda en az bir keyfi karakter içeren tüm kayıtları ver" anlamına gelir.

Aşağıdaki gibi sql-server'da joker karakterden kaçmalısınız []:

SELECT m.* 
FROM Manager m 
WHERE m.managerid    LIKE  '[_]%'
AND   m.managername  LIKE '%[_]%'

Bakınız: LIKE (Transact-SQL)

Demo


Cevabınızda MSDN bağlantısını sağladığınız için teşekkür ederiz. Gönderinizi okuyana kadar özel karakterin altını çizmekle ilgili bilgileri bulmakta zorlanıyordum.
Chris Smith

5
Kullanıcı sql-serversorusunda etiketi belirttiği ve sağladığı SQLFiddle da MS SQL Server 2008 olarak belirlendiği için bu doğru cevaptır .
Govind Rai

8

Özel olarak bir joker karakter aramak istediğinizde, bundan kaçmanız gerekir.

Bu, ifadenize ESCAPEcümle ekleyerek yapılır LIKE. Yantümce ile belirtilen ESCAPEkarakter, aşağıdaki joker karakteri "geçersiz kılacaktır".

İstediğiniz herhangi bir karakteri kullanabilirsiniz (sadece joker karakter değil). Çoğu insan a kullanıyor \çünkü birçok programlama dilinin de kullandığı

Yani sorgunuz şu sonuçlarla sonuçlanır:

select * 
from Manager
where managerid LIKE '\_%' escape '\'
and managername like '%\_%' escape '\';

Ancak başka herhangi bir karakteri de kullanabilirsiniz:

select * 
from Manager
where managerid LIKE '#_%' escape '#'
and managername like '%#_%' escape '#';

İşte bir SQLFiddle örneği: http://sqlfiddle.com/#!6/63e88/4


5

Alt çizgi, bir şey için bir joker karakterdir. örneğin 'A_%', 'A' ile başlayan tüm eşleşmeleri arayacak ve bundan sonra en az 1 ekstra karaktere sahip olacaktır


0

Sorguyu aşağıdaki gibi yazabilirsiniz:

SELECT * FROM Manager
WHERE managerid LIKE '\_%' escape '\'
AND managername LIKE '%\_%' escape '\';

sorununuzu çözecektir.


Bu, kabul edilen cevabın ötesine nasıl bir şey ekler?
Noah Broyles

0

Kullanıcıların BigQuery'de bunun nasıl yapılacağını araştırması durumunda:

  • Alt çizgi "_", tek bir karakter veya bayt ile eşleşir.

  • İki ters eğik çizgi kullanarak "\", "_" veya "%" karakterlerinden kaçabilirsiniz. Örneğin, "\%". Ham dizeler kullanıyorsanız, yalnızca tek bir ters eğik çizgi gerekir. Örneğin, r "\%".

WHERE mycolumn LIKE '%\\_%'

Kaynak: https://cloud.google.com/bigquery/docs/reference/standard-sql/operators

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.