2013-03-18 11 views
26

のように、コマンドを使用して、「LIKE」の大文字と小文字を区別動作を変更することが可能である:ケースは敏感と小文字を区別しない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キーワードを使用し、like文を大文字にすることができます。例えば

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

注、これは英語以外の文字では動作しません。 –

+0

@AlexanderMalakhovイタリア語とドイツ語の文字も同様に動作します。あなたがインポートしたdbとデータがすべてUTF-8エンコーディングであることを確認してください。 –

+6

@rbedger注意:** Like **はデフォルトで大文字と小文字を区別しないので、あなたは '上の関数'は必要ありません。 –

3
場合(あなたが列 COLLATE NOCASEを宣言していない限り)デフォルトでは敏感です

使用平野比較:

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

をこれは、元のLIKEプレフィックスを探している場合にのみ動作しますが、使用することができますインデックス。

1

私はこれが古い質問だと知っていますが、あなたがJavaでコーディングしていて、この問題がある場合、これは参考になるかもしれません。同様のチェックを処理する関数を登録することができます。私は先端の形にこのポストを得た:sqliteのJDBCに私は依存https://stackoverflow.com/a/29831950/1271573

ソリューション:https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc

私の場合は、特定の文字列を別の文字列の一部として存在していたかどうかを確認するために必要な(%のMyString%」のような')ので、Contains関数を作成しましたが、これを拡張してregexなどを使用してよりSQL的なチェックを行うことは可能です。 MyColが含まれている場合はどうしたら「検索文字列」を参照してSQLの関数を使用するには

:あなたが最初に登録する必要があり、この機能を使用するには

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); 
     } 
    } 
} 

:ここ

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

は私が関数が含まれていますそれ。あなたはそれを使用して完了したら、オプションでそれを破壊することができます。ここではどのようにある:

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

私のコードにバグが見つかりました。 Contains関数onを使用している列にnull値がある場合は、LowerCase関数に適用する前にvalue_text(n)でnullをチェックする必要があります。 –

関連する問題