50

SQLiteでは、次のコマンドを使用して、「LIKE」の大文字と小文字を区別する動作を変更できます。

PRAGMA case_sensitive_like=ON;
PRAGMA case_sensitive_like=OFF;

ただし、私の状況では、クエリを実行したいと思います。その一部は大文字と小文字を区別し、一部は区別しません。例えば:

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

これは可能ですか?

4

5 に答える 5

44

大文字と小文字を区別しないフィールドでUPPERキーワードを使用してから、likeステートメントを大文字にすることができます。例えば

SELECT * FROM mytable 
WHERE caseSensitiveField like 'test%' 
AND UPPER(caseInsensitiveField) like 'G2%'
于 2013-03-18T15:22:25.303 に答える
5

デフォルトで大文字と小文字を区別する単純な比較を使用します(列を宣言していない場合COLLATE NOCASE)。

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

これは、オリジナルLIKEがプレフィックスを検索している場合にのみ機能しますが、インデックスを使用できます。

于 2013-03-18T15:53:58.750 に答える
3

これは古い質問ですが、Javaでコーディングしていてこの問題が発生した場合は、これが役立つ可能性があります。同様のチェックを行う関数を登録できます。私はこの投稿からヒントを得ました:https ://stackoverflow.com/a/29831950/1271573

sqlite jdbcに依存するソリューション:https ://mvnrepository.com/artifact/org.xerial/sqlite-jdbc

私の場合、特定の文字列が別の文字列('%mystring%'など)の一部として存在するかどうかを確認するだけでよいので、Contains関数を作成しましたが、これを拡張してSQLのようなチェックを行うことができるはずです。正規表現などを使用します。

SQLで関数を使用して、MyColに「searchstring」が含まれているかどうかを確認するには、次のようにします。

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

これが私のContains関数です:

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());
}
于 2017-03-04T07:34:51.990 に答える
2

SQLiteでは、パターン検索にLIKEの代わりにGLOBを使用できます。例えば:

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

このアプローチを使用すると、PRAGMAについて心配する必要はありません。

于 2020-10-30T09:46:16.837 に答える
0

正規表現を使用して、必要なことを実行しました。すべて小文字ではない「In」という単語の出現をすべて識別したかったのです。

select [COL] from [TABLE] where [COL] REGEXP '\bIn\b';

例:

with x as (select 'in' Diff_Ins union select 'In' Diff_Ins)
select Diff_Ins from x where Diff_Ins REGEXP '\bIn\b';
于 2020-08-18T11:56:06.110 に答える