2013-03-18 88 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 2013-03-18 15:22:36

回答

26

您可以在不區分大小寫的字段上使用UPPER關鍵字,然後使用大寫的類似語句。例如

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

注意,這不適用於非英文字母的工作。 – 2013-08-21 03:04:59

+0

@AlexanderMalakhov適用於意大利和德國的人物。只要確保數據庫和您導入的數據全部採用UTF-8編碼,並且工作正常。 – 2014-07-15 08:22:05

+6

@rbedger請注意,您不需要Upper函數,因爲** Like **在默認情況下不區分大小寫。 – 2014-07-15 08:24:18

3

使用普通的比較,這是區分默認敏感的(除非您已聲明列COLLATE NOCASE):

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

這隻有原來的LIKE正在搜索的前綴,但允許使用索引。

1

我知道這是一個古老的問題,但如果您使用Java編碼並遇到此問題,這可能會有幫助。你可以註冊一個處理類似檢查的函數。我得到了尖形式這篇文章:https://stackoverflow.com/a/29831950/1271573

的解決方案,我依賴的sqlite的jdbc:https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc

在我的情況,看是否有一定的字符串存在作爲另一個字符串的一部分(如「%的MyString%我只需要'),所以我創建了一個Contains函數,但應該可以將其擴展爲使用正則表達式或類似方法進行更類似於sql的檢查。

要使用該功能在SQL,看看是否MyCol包含「搜索字符串」你會做:

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

在我的代碼中發現一個錯誤。如果您正在使用包含函數的列的值允許爲空值,則應在將值應用於toLowerCase函數之前檢查value_text(n)爲null。 – 2017-05-14 12:00:46