2009-12-02 11 views
86

मैं अपने SQL क्वेरी में केस संवेदनशील खोज करना चाहता हूं। लेकिन डिफ़ॉल्ट रूप से, SQL सर्वर स्ट्रिंग के मामले पर विचार नहीं करता है।WHERE खंड में केस संवेदनशील खोज कैसे करें (मैं SQL सर्वर का उपयोग कर रहा हूं)?

SQL क्वेरी में केस संवेदनशील खोज कैसे करें इस पर कोई विचार है?

+0

यह लिंक आपकी मदद कर सकता है http://www.codefari.com/2015/09/case-sensitive-search-on-column-in-sql.html – Singh

उत्तर

89

changing the Collation के माध्यम से किया जा सकता है। डिफ़ॉल्ट रूप से यह मामला असंवेदनशील है। लिंक से

अंश:

SELECT 1 
FROM dbo.Customers 
WHERE CustID = @CustID COLLATE SQL_Latin1_General_CP1_CS_AS 
    AND CustPassword = @CustPassword COLLATE SQL_Latin1_General_CP1_CS_AS 
+0

हमारे पास कब उपयोग किया जाए बदले में =। जैसे कि कस्टिड (@CustID) – rinuthomaz

140

मिलान का उपयोग कर या द्विआधारी के लिए कास्टिंग, इस तरह द्वारा:

SELECT * 
FROM Users 
WHERE 
    Username = @Username COLLATE SQL_Latin1_General_CP1_CS_AS 
    AND Password = @Password COLLATE SQL_Latin1_General_CP1_CS_AS 
    AND Username = @Username 
    AND Password = @Password 

उपयोगकर्ता नाम के दोहराव/पासवर्ड इंजन अनुक्रमित उपयोग करने की संभावना देने के लिए मौजूद है । उपरोक्त संयोजन एक केस संवेदनशील संयोजन है, यदि आवश्यक हो तो आपको उस व्यक्ति में बदलें।

दूसरा, बाइनरी में कास्टिंग, इस तरह से किया जा सकता है:

SELECT * 
FROM Users 
WHERE 
    CAST(Username as varbinary(100)) = CAST(@Username as varbinary)) 
    AND CAST(Password as varbinary(100)) = CAST(@Password as varbinary(100)) 
    AND Username = @Username 
    AND Password = @Password 
+8

इस प्रश्न को पढ़ने वाले लोगों को यह भी उपयोगी हो सकता है कि स्तंभ को स्वयं केस सेंसिटिव कैसे बदलना है, जो WHERE खंड में संयोजन का उपयोग करने की आवश्यकता को समाप्त करता है। देखें: http://stackoverflow.com/a/485394/908677 –

+0

सीधे डेटाबेस पर उपयोग किए जाने पर वर्बिनरी विधि के रूप में कलाकार मेरे लिए काम करता था, लेकिन .NET अनुप्रयोग से एक ही कथन भेजते समय काम नहीं करता - कोई विचार नहीं । लेकिन कोलेट विधि ठीक काम किया। – Doug

+1

यह उत्तर सही होगा यदि इसमें खोज शब्द कहां रखा जाए, यानी एक नियमित 'जैसे "* शब्द या वाक्यांश *" एसक्यूएल खोज के समान वाक्यांश डाला जाएगा। –

13

आप varbinary में बदलने का उपयोग कर क्वेरी कर सकते हैं - यह बहुत आसान है। उदाहरण:

Select * from your_table where convert(varbinary, your_column) = convert(varbinary, 'aBcD') 
8

उपयोग BINARY_CHECKSUM

SELECT 
FROM Users 
WHERE 
    BINARY_CHECKSUM(Username) = BINARY_CHECKSUM(@Username) 
    AND BINARY_CHECKSUM(Password) = BINARY_CHECKSUM(@Password) 
+0

इसका मतलब यह नहीं होगा कि यह अब सटीक तुलना नहीं है?कभी-कभी ऐसा हो सकता है कि यह सच साबित हो कि वे वास्तव में समान नहीं हैं? –

+1

मैं सहमत हूं कि @ O'Rooney इस अवसर पर झूठी सकारात्मक वापसी करेगा। –

4

उपयोग HASHBYTES

declare @first_value nvarchar(1) = 'a' 
declare @second_value navarchar(1) = 'A' 

if HASHBYTES('SHA1',@first_value) = HASHBYTES('SHA1',@second_value) begin 
    print 'equal' 
end else begin 
    print 'not equal' 
end 

-- output: 
-- not equal 

... में जहां खंड

declare @example table (ValueA nvarchar(1), ValueB nvarchar(1)) 

insert into @example (ValueA, ValueB) 
values ('a', 'A'), 
     ('a', 'a'), 
     ('a', 'b') 

select ValueA + ' = ' + ValueB 
from @example 
where hashbytes('SHA1', ValueA) = hashbytes('SHA1', ValueB) 

-- output: 
-- a = a 

select ValueA + ' <> ' + ValueB 
from @example 
where hashbytes('SHA1', ValueA) <> hashbytes('SHA1', ValueB) 

-- output: 
-- a <> A 
-- a <> b 

या एक मूल्य के

declare @value_b nvarchar(1) = 'A' 

select ValueB + ' = ' + @value_b 
from @example 
where hashbytes('SHA1', ValueB) = hasbytes('SHA1', @value_b) 

-- output: 
-- A = A 
2

MySQL में लगाना चाहते हैं कि आप मिलान बदल सकते हैं और केस संवेदी खोज करने के लिए तो बस का उपयोग द्विआधारी कीवर्ड इस प्रकार चाहते हैं नहीं करना चाहती:

SELECT * FROM table_name WHERE binary [email protected]_parameter and binary [email protected]_parameter 
+0

यह मान्य SQL सर्वर क्वेरी नहीं है। मुझे लगता है कि MySQL –

+1

MySQL पर पूरी तरह से काम करता है –

1

उपयोग Latin1_General_CS के रूप में आपके एसक्यूएल डीबी

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