2009-01-27 11 views
8

Şu anda Postgres üzerinde çalışmakta olan bir sorguya sahibim:Neden '% _' LIKE ile yaptığım sorgu tüm satırları döndürüyor ve yalnızca bir alt çizgi ile bitenleri değil?

SELECT * FROM addenda.users WHERE users.username LIKE '%\_' 

Ancak bir alt çizgi ile biten sadece girişleri döndürmek yerine, alt çizgi içerip içermediğine bakılmaksızın tüm sonuçları geri alırım.

Aşağıdaki sorguyu çalıştırmak yalnızca bir altçizgisi olan bir kullanıcı adı döndürür, bu nedenle kaçış şu şekilde çalışır:

SELECT * FROM addenda.users WHERE users.username LIKE '\_' 

Ve aşağıdaki sorguyu çalıştırmak, belirli bir harfle sona eren bir kullanıcı adı döndürür:

SELECT * FROM addenda.users WHERE users.username LIKE '%s' 

Neyi yanlış yapıyorum?

cevap

16

Ters eğik çizginiz PostgreSQL'e geçmiyor mu? Dize, ters eğik çizgiyi bir çıkış karakteri (ör. Bir Java Dizesi) olarak ele alan başka bir katmandan geçiriyorsanız, bu katman ters eğik çizgiyi kaldırabilir ve bu katman için ters eğik çizginizden kurtulmanız gerekebilir.

Başka tek karakterli kullanıcı adınız var mı? Ters eğik çizgi PostgreSQL hitap etmiyorsunuz olsaydı o zaman onlar da denemek mümkün olabilir '_'

eşleşir ESCAPE clause: username LIKE '%!_' ESCAPE '!'

+0

Sorguyu doğrudan sunucu üzerinde çalıştırıyorum, ters eğik çizgi geçiyor. Sadece ESCAPE komutunu kullanmayı denedim ve bu tam olarak nasıl istediğimi yaptı! 'Hazırlanmış deyimi, içine bir dize eklerken –

+1

' \ _' çizgi karakteriyle eşleşir ancak sql deyimi bir dize olduğunda, size gereken \\ _ 'yerine. Ben ilk '\' kaçar çünkü tahmin ediyorum ikinci '\' dize düzeyde, daha sonra Postgres'e azından '\ _' dizede görür ve alt çizgi karakteri ile uyuşan seviye. –

+0

Büyük olasılıkla 'standard_conforming_strings 'ayarınıza bağlı olarak kapalıysa,' \ 'değerini ikiye katlamanız ve" e "işaretinin önüne koymanız gerekir. Sadece bir tane açıksa '' 'gereklidir. SQL'e standart dışı uzatma postgres bulunmaz – Jasen

2

Ben postgres kullandım epey zaman oldu, ama sanırım olabilirsin İstediğiniz şeyi almak için '% [_]' yapın. Bu kesinlikle SQL Server üzerinde çalışır, ancak şu anda bir postgres veritabanı kurulumu yok denemek için şu anda

+1

yok. – Jasen

5

"_" çoğu SQL değişkeninde tek karakterli joker karakteridir. Eğer gerçek bir "_" karakteri eşleştirmek istiyorsanız bunu kaçmayı VAR.

2

Böyle bir çift biriyle sorguya ters eğik çizgi değiştirmek zorunda: Hala

SELECT * FROM addenda.users WHERE users.username LIKE '%\\_'

bir dize uyarı \\ bir standart dışı kullanımını alabilirsiniz, ama sorgu olacak yürütülür.
Postgres'te Test Edildi 8.4.

İlgili konular