2013-03-18 13 views
26

में SQLite में यह संभव है आदेशों का उपयोग करके की 'पसंद' केस संवेदी व्यवहार को बदलने के लिए असंवेदनशील:केस संवेदनशील और तरह SQLite

PRAGMA case_sensitive_like=ON; 
PRAGMA case_sensitive_like=OFF; 

हालांकि मेरी स्थिति में मैं एक प्रश्न पर अमल करना चाहते हैं, भाग जिनमें से मामला संवेदनशील है और जिसका हिस्सा नहीं है। उदाहरण के लिए:

SELECT * FROM mytable 
WHERE caseSensitiveField like 'test%' 
AND caseInsensitiveField like 'g2%' 

क्या यह संभव है?

+0

http://stackoverflow.com/a/973777/1427878 – CBroe

उत्तर

26

आप अपने मामले असंवेदनशील फ़ील्ड पर UPPER कीवर्ड का उपयोग कर सकते हैं, फिर ऊपरी मामले को आपके जैसे स्टेटमेंट का उपयोग कर सकते हैं। जैसे

SELECT * FROM mytable 
WHERE caseSensitiveField like 'test%' 
AND UPPER(caseInsensitiveField) like 'G2%' 
+11

ध्यान दें, यह गैर-अंग्रेज़ी अक्षर के लिए काम नहीं करता है: यहां बताया गया है। –

+0

@AlexanderMalakhov इतालवी और जर्मन पात्रों के लिए भी काम करता है। बस यह सुनिश्चित करें कि आपके द्वारा आयात किया गया डीबी और डेटा यूटीएफ -8 एन्कोडिंग में है, और यह काम करता है। –

+6

@rbedger नोट, आपको ऊपरी फ़ंक्शन की आवश्यकता नहीं है, क्योंकि ** की तरह ** डिफ़ॉल्ट रूप से केस-असंवेदनशील है। –

3

उपयोग सादे तुलना, जो मामले डिफ़ॉल्ट रूप से संवेदनशील होते हैं (जब तक आप स्तंभ COLLATE NOCASE घोषणा की है):

SELECT * 
FROM mytable 
WHERE caseSensitiveField >= 'test' 
    AND caseSensitiveField < 'tesu' 
    AND caseInsensitiveField LIKE 'g2%' 

यह तभी काम करता है मूल LIKE एक उपसर्ग के लिए खोज कर रहा है, लेकिन का उपयोग कर की अनुमति देता है एक अनुक्रमणिका।

1

मुझे पता है कि यह एक पुराना सवाल है, लेकिन यदि आप जावा में कोडिंग कर रहे हैं और यह समस्या है तो यह सहायक हो सकता है। आप एक ऐसे फ़ंक्शन को पंजीकृत कर सकते हैं जो चेकिंग को संभालता है। मैं टिप प्रपत्र इस पोस्ट है: https://stackoverflow.com/a/29831950/1271573

समाधान SQLite JDBC पर मैं निर्भर: https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc

मेरे मामले में मैं केवल अगर एक निश्चित स्ट्रिंग (एक और स्ट्रिंग के भाग के रूप में अस्तित्व '% mystring% की तरह देखना चाहते थे '), इसलिए मैंने एक फंक्शन बनाया है, लेकिन इसे रेगेक्स या कुछ का उपयोग करके अधिक एसक्यूएल जैसी जांच करने के लिए इसे विस्तारित करना संभव होना चाहिए।

एसक्यूएल में फ़ंक्शन का उपयोग करने देखने के लिए अगर MyCol शामिल है "searchstring" आप क्या करेंगे:

select * from mytable where Contains(MyCol, 'searchstring') 

यहाँ है मेरी शामिल समारोह:

public class Contains extends Function { 

    @Override 
    protected void xFunc() throws SQLException { 
     if (args() != 2) { 
      throw new SQLException("Contains(t1,t2): Invalid argument count. Requires 2, but found " + args()); 
     } 
     String testValue = value_text(0).toLowerCase(); 
     String isLike = value_text(1).toLowerCase(); 

     if (testValue.contains(isLike)) { 
      result(1); 
     } else { 
      result(0); 
     } 
    } 
} 

इस सुविधा का उपयोग करने से पहले आपको रजिस्टर करना होगा यह। जब आप इसे इस्तेमाल करने के साथ कर लेंगे तो आप वैकल्पिक रूप से इसे नष्ट कर सकते हैं।

public static void registerContainsFunc(Connection con) throws SQLException { 
    Function.create(con, Contains.class.getSimpleName(), new Contains()); 
} 
public static void destroyContainsFunc(Connection con) throws SQLException { 
    Function.destroy(con, Contains.class.getSimpleName()); 
} 
+0

मेरे कोड में एक बग मिला। यदि आप जिस कॉलम का उपयोग कर रहे हैं उसमें कॉलम के पास शून्य मानों की अनुमति है, तो आपको lowCase फ़ंक्शन को लागू करने से पहले शून्य_ valuext (n) को शून्य के लिए जांचना चाहिए। –

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