SQLiteでは、次のコマンドを使用して、 'LIKE'の大文字と小文字を区別する動作を変更できます。
PRAGMA case_sensitive_like=ON;
PRAGMA case_sensitive_like=OFF;
しかし、私の状況では、一部は大文字と小文字を区別し、一部はそうではないクエリを実行したいと思います。例えば:
SELECT * FROM mytable
WHERE caseSensitiveField like 'test%'
AND caseInsensitiveField like 'g2%'
これは可能ですか?
大文字と小文字を区別しないフィールドでUPPERキーワードを使用してから、like文を大文字にすることができます。例えば.
SELECT * FROM mytable
WHERE caseSensitiveField like 'test%'
AND UPPER(caseInsensitiveField) like 'G2%'
デフォルトの大文字と小文字を区別する単純な比較を使用します(列COLLATE NOCASE
を宣言していない場合)。
SELECT *
FROM mytable
WHERE caseSensitiveField >= 'test'
AND caseSensitiveField < 'tesu'
AND caseInsensitiveField LIKE 'g2%'
これは、元のLIKE
がプレフィックスを検索している場合にのみ機能しますが、インデックスの使用を許可します。
私はこれが古い質問であることを知っていますが、Javaでコーディングしていてこの問題がある場合、これは役に立つかもしれません。同様のチェックを処理する関数を登録できます。投稿: https://stackoverflow.com/a/29831950/127157
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());
}
COLLATE NOCASEで作成された列で大文字と小文字を区別するクエリを実行するには、COLLATE BINARYを使用します。
select * from myTable where name like 'Test%' COLLATE BINARY;