मैं एक वर्ग खंड में वर्ग कोष्ठक से कैसे बच सकता हूं?


236

मैं जैसे संग्रहित प्रक्रिया के साथ आइटम फ़िल्टर करने का प्रयास कर रहा हूं। स्तंभ एक वर्चर (15) है। जिन वस्तुओं को मैं फ़िल्टर करने की कोशिश कर रहा हूं, उनके नाम में वर्ग कोष्ठक हैं।

उदाहरण के लिए WC[R]S123456:।

अगर मैं ऐसा करता हूं तो LIKE 'WC[R]S123456'यह कुछ भी नहीं लौटाएगा।

मुझे ESCAPEकीवर्ड का उपयोग करने के बारे में कुछ जानकारी मिली, LIKEलेकिन मुझे यह समझ में नहीं आ रहा है कि स्क्वायर ब्रैकेट को नियमित स्ट्रिंग के रूप में उपयोग करने के लिए इसका उपयोग कैसे करें।

जवाबों:


328
LIKE 'WC[[]R]S123456' 

या

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

कार्य करना चाहिए।


10
ESCAPE कीवर्ड आवश्यक है यदि आप एक कस्टम एस्केप कैरेक्टर (बैकस्लैश वास्तव में कस्टम है) का उपयोग करना चाहते हैं।
रयान कोन

2
मैंने उत्तर के दूसरे भाग को भी ठीक किया। पहले और बाद के संस्करणों के साथ एसक्यूएल फिडल
मार्टिन स्मिथ

10
यदि किसी को यह स्पष्ट नहीं है कि ब्रैकेट को क्यों बचाना है, तो LIKE के लिए दस्तावेज़ीकरण यह दर्शाता है कि इसका उपयोग किसी श्रेणी या सेट में किसी एकल वर्ण से मेल खाने के लिए किया जाता है। उदाहरण के लिए, उपयोग LIKE '[fz]oo''फू' और 'चिड़ियाघर' दोनों से मेल खाएगा।
होलिस्टिक डेवलपर

3
जवाब में इन दोनों के लिए तर्क करना अच्छा होगा। यह मेरे लिए तुरंत स्पष्ट नहीं था कि पहला उदाहरण तब तक काम करेगा जब तक मैं नीचे दिए गए अमितेश के जवाब को नहीं पढ़ता।
डॉन ज्वेट

1
LIKE 'WC\[R]S123456' ESCAPE '\'इसे प्राथमिकता दें क्योंकि यह रखरखाव के लिए अधिक पठनीय है।
अग्नि

119

मान लीजिए कि आप शाब्दिक से मेल खाना चाहते हैं its[brac]et

आपको भागने की ज़रूरत नहीं है ]क्योंकि इसका विशेष अर्थ है जब इसे जोड़ा जाता है [

इसलिए [समस्या को हल करने के लिए बच निकलता है। आप [ इसे बदलकर बच सकते हैं [[]


7
यह वास्तव में मददगार था और सर्वोत्तम उत्तर का अनुकरण करता है।
जारेड सोल

1
[[]अजीब लगता है, लेकिन यह समझ में आता है जब आप इसे पार्सर के दृष्टिकोण से देखते हैं। पार्सर के बीच एक विशिष्ट नियम है कि कैसे वर्णों को संभालना है [ ]। तो, पाठ का its[brac]etअर्थ है: "निम्नलिखित लगातार तार खोजें: its(वर्ग कोष्ठक के लिए नियम लागू करें brac) : et" । दूसरी ओर, का its[[]brac]etअर्थ है: "निम्नलिखित लगातार तार खोजें: its(वर्ग कोष्ठक के लिए नियम लागू करें:) [, brac]et"
ब्रायन

28

मुझे उन नामों को बाहर करने की आवश्यकता थी जो एक क्वेरी से अंडरस्कोर के साथ शुरू हुए थे, इसलिए मैंने इसे समाप्त किया:

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

2
मुझे इस संस्करण का उपयोग करना था (स्पष्ट रूप से "भागने" वर्ण को निर्दिष्ट करना) - यहां अन्य उत्तर मेरे लिए सही परिणाम नहीं देते थे।
मार्क


15

ESCAPE कीवर्ड का उपयोग तब किया जाता है जब आपको विशेष वर्णों जैसे% और _ की खोज करने की आवश्यकता होती है, जो आमतौर पर वाइल्ड कार्ड होते हैं। यदि आप ESCAPE निर्दिष्ट करते हैं, तो SQL अक्षर% और _ के लिए शाब्दिक खोज करेगा।

यहाँ कुछ और उदाहरणों के साथ एक अच्छा लेख दिया गया है

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

-- or 

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

6

यदि आपको '_' (अंडरस्कोर) जैसे विशेष वर्णों से बचना होगा , जैसा कि मेरे मामले में था, और आप ESCAPE क्लॉज को परिभाषित करने में सक्षम नहीं हैं, तो आप वर्ग कोष्ठक के साथ विशेष वर्ण को जोड़ना चाह सकते हैं [ ' और '] '

यह "अजीब" स्ट्रिंग का अर्थ समझाता है '[[]' - यह सिर्फ वर्ग कोष्ठक के साथ '[' चरित्र को गले लगाता है , प्रभावी रूप से इससे बच जाता है।

मेरा उपयोग मामला Profiler के लिए एक फिल्टर मानदंड के रूप में इसमें अंडरस्कोर के साथ एक संग्रहीत प्रक्रिया का नाम निर्दिष्ट करना था। इसलिए मैंने एक TextData LIKE फ़ील्ड में [_] [_] [[]] [[]] को स्ट्रिंग '%' नाम दिया है और इसने मुझे जो परिणाम प्राप्त करना चाहा था, उसे ट्रेस किया।

यहाँ प्रलेखन से एक अच्छा उदाहरण है: LIKE (Transact-SQL) - वाइल्डकार्ड अक्षर का उपयोग करना


4

प्रलेखन के अनुसार :

आप वाइल्डकार्ड पैटर्न के मिलान वाले पात्रों का उपयोग शाब्दिक वर्णों के रूप में कर सकते हैं। वाइल्डकार्ड वर्ण का उपयोग शाब्दिक वर्ण के रूप में करने के लिए, कोष्ठक में वाइल्डकार्ड वर्ण को संलग्न करें।

आपको इन तीन पात्रों से बचने की आवश्यकता है %_[:

'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

कीबोर्ड पर '\' या किसी अन्य वर्ण के बजाय, आप उन विशेष वर्णों का भी उपयोग कर सकते हैं जो कीबोर्ड पर नहीं हैं। आपके उपयोग के मामले के आधार पर, यह आवश्यक हो सकता है, यदि आप नहीं चाहते कि उपयोगकर्ता इनपुट गलती से भागने के पात्र के रूप में उपयोग किया जाए।


2
मैं अक्सर उपयोग करता हूं ¬- यह अभी भी ब्रिटेन में एक कीबोर्ड चरित्र है, लेकिन शायद ही कभी जानबूझकर इस्तेमाल किया :) (शीर्ष के बीच छोड़ दिया Escऔर Tab)
एंडी मोहर

उपयोगकर्ता अभी भी डेटा युक्त पत्र प्रस्तुत कर सकते हैं जो कीबोर्ड पर नहीं हैं। यह जवाब वास्तव में समस्या को हल करने से बचने के लिए एक सुझाव की तरह लगता है ...
binki

0

निम्नलिखित का उपयोग करें।

उपयोगकर्ता इनपुट के रूप में इसे खोजने के लिए, भागने का उपयोग करें, इसमें सभी विशेष वर्णों के लिए निम्न प्रतिस्थापन की आवश्यकता होगी (नीचे SQL सर्वर के सभी को शामिल किया गया है)।

यहां एकल उद्धरण "'" नहीं लिया गया है क्योंकि यह क्लॉज की तरह प्रभावित नहीं करता है क्योंकि यह स्ट्रिंग के संयोजन का मामला है।

"-" & "^" & "]" प्रतिस्थापन की आवश्यकता नहीं है क्योंकि हम बच रहे हैं "["।

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

फिर, SQL क्वेरी में यह निम्नानुसार होना चाहिए। (पैरामीटर क्वेरी में, स्ट्रिंग को प्रतिस्थापन के बाद के पैटर्न के साथ जोड़ा जा सकता है)।

सटीक स्ट्रिंग की खोज करने के लिए।

like 'FormattedString' ESCAPE 'ð'

स्ट्रिंग से खोज शुरू करने के लिए

like '%FormattedString' ESCAPE 'ð'

स्ट्रिंग के साथ अंत खोजने के लिए

like 'FormattedString%' ESCAPE 'ð'

स्ट्रिंग के साथ खोज करने के लिए

like '%FormattedString%' ESCAPE 'ð'

और इसी तरह अन्य पैटर्न मिलान के लिए। लेकिन उपर्युक्त के अनुसार प्रत्यक्ष उपयोगकर्ता इनपुट को प्रारूपित करने की आवश्यकता है।


0

उस समय में एक समस्या है:

LIKE 'WC[[]R]S123456' 

तथा:

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

दोनों SQL सर्वर के लिए काम करते हैं लेकिन ना ही Oracle के लिए काम करते हैं।

ऐसा लगता है कि लेफ्ट ब्रेस वाले पैटर्न को पहचानने का कोई आईएसओ / आईईसी 9075 तरीका नहीं है।

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