文字列の一致によって sqlite3 データベースからレコードを選択したいのですが、where 句で '=' を使用すると、sqlite3 が大文字と小文字を区別することがわかりました。大文字と小文字を区別しない文字列比較を使用する方法を教えてください。
ベストアンサー1
COLLATE NOCASE
クエリでは以下を使用できますSELECT
:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
collate nocase
さらに、SQLiteでは、テーブルを作成するときに列定義で(他のオプションはbinary
(デフォルト)とrtrim
)を指定することにより、列が大文字と小文字を区別しないことを示すことができます。ここ)。インデックスを作成するタイミングも指定できますcollate nocase
。例:
テーブルテストの作成 ( Text_Value テキスト照合大文字小文字なし ); テスト値 ('A') に挿入します。 テスト値 ('b') に挿入します。 テスト値 ('C') に挿入します。 インデックス Test_Text_Value_Index を作成する テスト(Text_Value collate nocase)の場合
を含む式では、大文字と小文字Test.Text_Value
が区別されなくなりました。例:
sqlite> Text_Value = 'B' の場合、Test から Text_Value を選択します。 テキスト値 ---------------- b sqlite> Test から Text_Value を選択し、Text_Value で順序付けします。 テキスト値 ---------------- あ b C sqlite> Test から Text_Value を選択し、Text_Value desc で順序付けします。 テキスト値 ---------------- C b あ
オプティマイザは、列の大文字と小文字を区別しない検索と一致のためにインデックスを使用する可能性もあります。これは、explain
次の SQL コマンドを使用して確認できます。
sqlite> explain Text_Value を Test から選択します where Text_Value = 'b'; アドレス オペコード p1 p2 p3 ---------------- -------------- ---------- ---------- --------------------------------- 0 0 16へ 1 整数 0 0 2 オープンリード 1 3 キー情報(1,NOCASE) 3 列数の設定 1 2 4 ストリング8 0 0 b 5 ヌル -1 14 6 記録する 1 0 a 7 メモリストア 0 0 8 ムーブゲ 1 14 9 メモリロード 0 0 10 idxGE 1 14 + 11 列 1 0 12 コールバック 1 0 13 次へ 1 9 14 閉じる 1 0 15 停止 0 0 16 トランザクション 0 0 17 クッキーを検証 0 4 18 ゴートゥー 0 1 19 ヌープ 0 0