SQL केस सेंसिटिव स्ट्रिंग की तुलना करें


234

आप स्ट्रिंग्स की तुलना कैसे करते हैं ताकि तुलना तभी सही हो जब स्ट्रिंग्स में से प्रत्येक के मामले समान हों। उदाहरण के लिए:

Select * from a_table where attribute = 'k'

... 'K' की एक विशेषता के साथ एक पंक्ति लौटाएगा। मुझे यह व्यवहार नहीं चाहिए।


यह वह नहीं हो सकता है जिसकी आपको आवश्यकता है लेकिन आप Collation को बदल सकते हैं या अपनी क्वेरी में किसी विशिष्ट Collation का उपयोग कर सकते हैं।
केन

7
कौन सा SQL उत्पाद?
onedaywhen

जवाबों:


388
Select * from a_table where attribute = 'k' COLLATE Latin1_General_CS_AS 

की चाल चली।


4
मैं सामान्य रूप से लैटिन 1_General_Bin
gbn

3
हां, मानक दृष्टिकोण केस-असंवेदनशील टकराव का उपयोग करना है, हालांकि कोलाज स्वयं विक्रेता-विशिष्ट हैं। क्या आपका SQL Server सिंटैक्स है?
20:10

मेरे मामले में, मेरे db में 1 कॉलम है जो केस-संवेदी है। मुझे इसकी तुलना एक मानक (CI) कॉलम से करने की आवश्यकता थी। मैंने इस WHERE Foo.Bar = (Baz.Bar COLLATE Latin1_General_CS_AS) का एक रूपांतर इस्तेमाल किया
Hypnovirus

2
धन्यवाद लेकिन क्या है Latin1_General_CS_AS ?? क्या यह विशेष कीवर्ड है?
विजय सिंह राणा

2
@VijaySinghRana टकराव Latin1_General_CS_ASका एक विनिर्देश है। Collation, नियमों के एक सेट को संदर्भित करता है जो यह निर्धारित करता है कि डेटा को कैसे सॉर्ट किया गया और तुलना की गई। देखें इस पेज में अधिक जानकारी के लिए।

51

इस सिंटैक्स का उपयोग करके आप उस विशेषता को केस संवेदी के रूप में भी परिवर्तित कर सकते हैं :

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CS_AS

अब आपकी खोज संवेदनशील होगी ।

यदि आप उस कॉलम केस को फिर से असंवेदनशील बनाना चाहते हैं , तो उपयोग करें

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CI_AS

29

आप स्तंभों को आसानी से वैरबिनरी (अधिकतम लंबाई) में परिवर्तित कर सकते हैं, दोषपूर्ण तुलना से बचने के लिए लंबाई अधिकतम होनी चाहिए, यह स्तंभ की लंबाई के रूप में लंबाई निर्धारित करने के लिए पर्याप्त है। ट्रिम कॉलम आपको वास्तविक मूल्य की तुलना करने में मदद करता है, सिवाय इसके कि आपके टेबल कॉलम में स्थान का कोई अर्थ और मूल्यवान है, यह एक सरल नमूना है और जैसा कि आप देख सकते हैं कि मैं कॉलम को ट्रिम कर देता हूं और फिर कन्वर्ट और तुलना करता हूं।:

CONVERT(VARBINARY(250),LTRIM(RTRIM(Column1))) = CONVERT(VARBINARY(250),LTRIM(RTRIM(Column2)))

उममीद है कि इससे मदद मिलेगी।


2
ठीक वही जो मेरे द्वारा खोजा जा रहा था। एक बार करने का एक सरल तरीका, ऊपरी-अक्षर वाले अक्षरों वाली प्रविष्टियों को खोजने के लिए केस संवेदी तुलना।
माइक डी।

20

बस एक और विकल्प के रूप में आप इस तरह से कुछ का उपयोग कर सकते हैं:

SELECT * 
FROM a_table 
WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k')

1
टक्करों के बारे में क्या? यह दुर्लभ होगा, लेकिन मुझे लगता है कि एक ही मूल्य के लिए कई तार होंगे।
डेविड क्लेम्फनर

हां संभव है, लेकिन इस तरह के एक साधारण स्ट्रिंग उदाहरण पर मैं बहुत कम सोचूंगा।
डेव सेक्स्टन

@DavidKlempfner पहले तुलना क्यों नहीं करते हैं और अगर वे मेल खाते हैं तो हैशबाइट्स के लिए भी जाँच करें? हम इसे एक समारोह बना सकते हैं और इसे StringsAreCaseSensitiveEqual (a, b) => a = b और HASHBYTES ('sha1'), a = = HASHBYTES ('sha1, b)
Demetris Leptos

3

आप अपनी खोज के attributeरूप में BINARYया उपयोग INSTRया परिभाषित कर सकते हैं STRCMP


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