LIKE फ़िल्टर में अंडरस्कोर वर्ण का उपयोग करने से मुझे सभी परिणाम क्यों मिलते हैं?


118

मैंने एक LIKEशर्त के साथ नीचे SQL क्वेरी लिखी है :

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

में LIKEमैं किसी भी अंडरस्कोर लिए खोज करना चाहते %_%हैं, लेकिन मैं जानता हूँ कि मेरे कॉलम 'डेटा कोई अंडरस्कोर वर्ण हैं।

  • क्वेरी मुझे तालिका से सभी रिकॉर्ड क्यों देती है?

नमूना डेटा:

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
Sql-fiddle क्वेरी जोड़ना अच्छा है, लेकिन आपको हमेशा SO पर सादे पाठ के रूप में क्वेरी दिखाना चाहिए। अन्यथा यह सवाल सड़ांध को जोड़ने के लिए कमजोर है
टिम शाल्टर

_ :: एकल चरित्र के लिए एक विकल्प
vhadalgi

जवाबों:


193

अपनी WHEREस्थिति को इस तरह से संशोधित करें :

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

यह एक तरीका है जिसमें ओरेकल भागने के पात्रों का समर्थन करता है। यहां आप escapeकीवर्ड के साथ एस्केप कैरेक्टर को परिभाषित करते हैं । विवरण के लिए यह लिंक ओरेकल डॉक्स पर देखें ।

'_'और '%'एक में वाइल्डकार्ड हैं LIKEएसक्यूएल में संचालित बयान।

_चरित्र (किसी भी) एक ही चरित्र का एक उपस्थिति के लिए लग रहा है। यदि आप के द्वारा खोज columnName LIKE '_abc', तो यह आपको पंक्तियों होने के साथ परिणाम दे देंगे 'aabc', 'xabc', '1abc', '#abc'नहीं लेकिन'abc' , 'abcc', 'xabcd'और इतने पर।

'%'चरित्र 0 या अधिक वर्णों की संख्या मिलान के लिए प्रयोग किया जाता है। इसका मतलब है कि अगर आप के द्वारा खोज columnName LIKE '%abc', तो यह आपको परिणाम दे देंगे होने के साथ 'abc', 'aabc', 'xyzabc'और इतने पर है, लेकिन कोई'xyzabcd' , 'xabcdd'और किसी भी अन्य स्ट्रिंग है जो साथ अंत नहीं है 'abc'

आपके मामले में आपने खोजा है '%_%'। यह उस स्तंभ के साथ सभी पंक्तियों को देगा जिसमें एक या अधिक वर्ण होते हैं, जिसका अर्थ है किसी भी वर्ण, इसके मूल्य के रूप में। यही कारण है कि आप सभी पंक्तियों को प्राप्त कर रहे हैं, भले ही _आपके कॉलम मूल्यों में कोई भी नहीं है।


मुझे Db तक पहुँचने में भी यही समस्या है। कृपया मुझे बताएं कि मैं इस मुद्दे को कैसे हल कर सकता हूं।

शायद आप 'एक्सेस डीबी में वाइल्डकार्ड' के लिए Google कर सकते हैं। मैंने कभी एक्सेस पर काम नहीं किया, इसलिए मैं आपकी मदद नहीं कर सकता। मुझे भी शक है अगर एक्सेस likeऑपरेटर का समर्थन करता है। मेरा समाधान अधिकांश में काम करेगा, यदि सभी डेटाबेस नहीं।
राचा

2
यहाँ जो नहीं बताया गया है वह यह है कि यह SQL सर्वर पर भी काम करता है - जो शुरू में मुझे इस बात पर परेशान करता था कि ओपी ओरेकल एसक्यूएल के लिए एक उत्तर क्यों स्वीकार करता है, जब वे स्वयं SQL सर्वर के लिए प्रश्न टैग करते हैं। मूल रूप से टैग किए गए DBMS को मुख्य रूप से लक्षित करने के लिए कम से कम उत्तर लिखा जाना चाहिए।
अंडरस्कोर_ड

87

अंडरस्कोर एक मनमाना चरित्र के लिए क्वेरी में वाइल्डकार्ड हैLIKE

इसलिए LIKE %_%इसका अर्थ है "मुझे इस कॉलम में कम से कम एक मनमाना चरित्र के साथ सभी रिकॉर्ड दें"।

आपको वाइल्डकार्ड वर्ण से बचना होगा, []चारों ओर sql- सर्वर में :

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

देखें: LIKE (Transact-SQL)

Demo


आपके उत्तर के भीतर MSDN लिंक प्रदान करने के लिए धन्यवाद। जब तक मैं आपकी पोस्ट नहीं पढ़ता, मुझे अंडरस्कोर विशेष चरित्र के बारे में जानकारी प्राप्त करने में मुश्किल समय हो रहा था।
क्रिस स्मिथ

5
यह सही उत्तर है क्योंकि उपयोगकर्ता sql-serverने अपने प्रश्न में टैग निर्दिष्ट किया है और उनके द्वारा प्रदान की गई SQLFiddle को MS SQL Server 2008 के रूप में भी नामित किया गया है।
गोविंद राय

8

जैसा कि आप विशेष रूप से एक वाइल्डकार्ड चरित्र के लिए खोज करना चाहते हैं जिसे आपको बच निकलने की आवश्यकता है

यह ESCAPEआपके LIKEएक्सप्रेशन में क्लॉज जोड़कर किया जाता है । के साथ निर्दिष्ट चरित्रESCAPE क्लॉज के वह निम्नलिखित वाइल्डकार्ड वर्ण को "अमान्य" कर देगा।

आप अपने पसंद के किसी भी चरित्र का उपयोग कर सकते हैं (सिर्फ वाइल्डकार्ड वर्ण नहीं)। ज्यादातर लोग इसका उपयोग करते हैं, \क्योंकि कई प्रोग्रामिंग भाषाएं भी इसका उपयोग करती हैं

तो आपकी क्वेरी में परिणाम होगा:

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

लेकिन आप बस किसी अन्य चरित्र का उपयोग कर सकते हैं:

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

यहाँ एक SQLField उदाहरण है: http://sqlfiddle.com/# -6 / 63e88 /4


5

अंडरस्कोर कुछ के लिए एक वाइल्डकार्ड है। उदाहरण के लिए 'A_%' उन सभी मैच को देखेगा जो 'A' को प्रारंभ करते हैं और उसके बाद न्यूनतम 1 अतिरिक्त वर्ण रखते हैं


0

आप नीचे दिए अनुसार प्रश्न लिख सकते हैं:

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

यह आपकी समस्या का समाधान करेगा।


यह स्वीकृत उत्तर से परे कुछ भी कैसे जोड़ता है?
नूह ब्रोन्स

0

यदि लोग इसे BigQuery में करना चाहते हैं

  • एक अंडरस्कोर "_" एकल वर्ण या बाइट से मेल खाता है।

  • आप दो बैकस्लैश का उपयोग करके "\", "_", या "%" से बच सकते हैं। उदाहरण के लिए, "\%"। यदि आप कच्चे तार का उपयोग कर रहे हैं, तो केवल एक बैकस्लैश की आवश्यकता है। उदाहरण के लिए, r "\%"।

WHERE mycolumn LIKE '%\\_%'

स्रोत: https://cloud.google.com/bigquery/docs/reference/standard-sql/operators

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.