2009-01-27 12 views
8

मेरे पास वर्तमान में पोस्टग्रेस पर चलने वाली क्वेरी है:LIKE '% _' के साथ मेरी क्वेरी क्यों सभी पंक्तियों को वापस करती है न केवल अंडरस्कोर में समाप्त होती है?

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

लेकिन फिर अंडरस्कोर में समाप्त होने वाली प्रविष्टियों को वापस लौटने के बाद, मुझे सभी परिणाम वापस मिलते हैं, भले ही इसमें अंडरस्कोर है या नहीं।

नीचे दी गई क्वेरी को चलाने से उपयोगकर्ता नाम लौटाता है जो कि एक अंडरस्कोर है, इसलिए भागने से काम करता है:

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

और नीचे दी गई क्वेरी को चलाने से एक उपयोगकर्ता नाम लौटाता है जो एक विशिष्ट अक्षर (ओं) के साथ समाप्त होता है:

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

मैं गलत क्या कर रहा हूं?

उत्तर

16

क्या आपकी बैकस्लैश PostgreSQL से नहीं हो रही है? यदि आप एक और परत के माध्यम से स्ट्रिंग को पार कर रहे हैं जो बैकस्लैश को एक बचने वाले चरित्र (जैसे जावा स्ट्रिंग) के रूप में मानता है, तो वह परत बैकस्लैश को हटा सकती है, और आपको उस परत के लिए अपने बैकस्लैश से बचने की आवश्यकता हो सकती है।

क्या आपके पास कोई और एकल वर्ण उपयोगकर्ता नाम है? बैकस्लैश PostgreSQL के माध्यम से नहीं हो रही थी तो वे भी मेल खाएंगे '_'

आप की कोशिश करने में सक्षम हो सकता ESCAPE clause: username LIKE '%!_' ESCAPE '!'

+0

मैं सीधे सर्वर पर क्वेरी चला रहा हूं ताकि बैकस्लैश हो रहा हो। मैंने बस ESCAPE कमांड का उपयोग करने का प्रयास किया और यह ठीक से काम करता है कि मैं कैसे चाहता हूं! –

+1

एक तैयार कथन में स्ट्रिंग डालने पर, \ \' अंडरस्कोर वर्ण से मेल खाता है, लेकिन जब SQL स्टेटमेंट में स्ट्रिंग अक्षर होता है, तो आपको इसके बजाय '\\ _' की आवश्यकता होती है। मैं अनुमान लगा रहा हूं क्योंकि पहला '\' स्ट्रिंग अक्षर स्तर पर दूसरे '\' से बचता है, फिर पोस्टग्रेस स्तर पर यह स्ट्रिंग में '\ _' देखता है और इसे अंडरस्कोर वर्ण से मेल खाता है। –

+0

यह बड़े पैमाने पर 'standard_conforming_strings' की सेटिंग पर निर्भर करता है यदि इसे बंद कर दिया गया है तो आपको' \ 'को डबल करने की आवश्यकता है और उद्धरण चिह्न से पहले' e' रखना चाहिए। यदि यह चालू है तो केवल एक '\' की आवश्यकता है। – Jasen

2

थोड़ा समय के बाद से मैं postgres का उपयोग किया है हो गया है, लेकिन मुझे लगता है आप कर सकते हैं आप जो चाहते हैं उसे प्राप्त करने के लिए '% [_]' करें। यह निश्चित रूप से SQL सर्वर पर काम करता है, हालांकि मेरे पास

+1

पोस्टग्रेज़ में SQL के लिए गैर-मानक एक्सटेंशन मौजूद नहीं है। – Jasen

5

"_" पर अधिकांश SQL संस्करणों में सिंगल-कैरेक्टर वाइल्डकार्ड है, तो यह निश्चित रूप से एक पोस्टग्रेज़ डेटाबेस सेटअप नहीं है। यदि आप वास्तविक "_" वर्ण से मेल खाना चाहते हैं तो आपको इसे बचाना होगा।

2

आप बैकस्लैश इस तरह, एक डबल एक के साथ आपकी क्वेरी पर बदलने के लिए:

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

फिर भी आप एक स्ट्रिंग शाब्दिक चेतावनी में \\ की एक गैरमानक उपयोग मिल सकता है, लेकिन क्वेरी होगा सज़ा पाएं।
पोस्टग्रेज़ 8.4 में परीक्षण किया गया।

संबंधित मुद्दे