回答:
あなたは使用することができCOLLATE NOCASE
、あなたの中SELECT
のクエリ:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
さらに、SQLiteではcollate nocase
、列の定義で指定することにより、テーブルを作成するときに列の大文字と小文字を区別しないように指定できます(他のオプションはbinary
(デフォルト)およびrtrim
です。ここを参照)。collate nocase
インデックスを作成するタイミングも指定できます。例えば:
テーブルテストを作成する ( Text_Valueテキスト照合nocase ); テスト値に挿入( 'A'); テスト値に挿入( 'b'); テスト値に挿入( 'C'); インデックスの作成Test_Text_Value_Index テスト時(Text_Value collate nocase);
関係Test.Text_Value
する式では、大文字と小文字が区別されなくなりました。例えば:
sqlite> Text_Value = 'B'のテストからText_Valueを選択します。 Text_Value ---------------- b sqlite> Text_ValueによるテストオーダーからText_Valueを選択します。 Text_Value ---------------- あ b C sqlite> Text_Valueによるテストの順序からText_Valueを選択しますdesc; Text_Value ---------------- C b あ
オプティマイザは、大文字と小文字を区別しない検索と列の照合にインデックスを利用する可能性もあります。これは、explain
SQLコマンドを使用して確認できます。例:
sqlite> ExplainからText_Value = 'b'を選択して、Text_Valueを選択します。 addrオペコードp1 p2 p3 ---------------- -------------- ---------- ---------- --------------------------------- 0後藤0 16 1整数0 0 2 OpenRead 1 3 keyinfo(1、NOCASE) 3 SetNumColumns 1 2 4文字列8 0 0 b 5 IsNull -1 14 6 MakeRecord 1 0 a 7 MemStore 0 0 8 MoveGe 1 14 9 MemLoad 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 VerifyCookie 0 4 18後藤0 1 19なし0 0
COLLATE NOCASE
フィールド自体にこの照合がすでに定義されている場合は、インデックスに追加する必要はありません。「デフォルトの照合シーケンスは、CREATE TABLEステートメントでその列に対して定義された照合シーケンスです。」
COLLATE NOCASE
ASCIIテキストでのみ機能します。列の値に「FIANCÉ」または「voilà」が含まれると、「fiancé」または「VOILA」とは一致しません。ICU拡張機能を有効にすると、LIKE
大文字と小文字が区別されなくなるため'FIANCÉ' LIKE 'fiancé'
、trueになりますが、'VOILA' LIKE 'voilà'
それでもfalseです。また、ICU + LIKEにはインデックスを使用しないという欠点があるため、大きなテーブルでは遅くなる可能性があります。
select * from tbl where firstname='john' and lastname='doe' COLLATE NOCASE
は、で大文字と小文字を区別しないことlastname
です。で大文字と小文字を区別しないようにするにはfirstname
、次のように記述しますselect * from tbl where firstname='john' COLLATE NOCASE and lastname='doe'
。where
句全体ではなく、その1つの列に固有です。
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
あなたはこのようにそれを行うことができます:
SELECT * FROM ... WHERE name LIKE 'someone'
(それは解決策ではありませんが、場合によっては非常に便利です)
" LIKE演算子はパターンマッチングの比較を行います。右側のオペランドにはパターンが含まれ、左側のオペランドにはパターンと照合する文字列が含まれます。パターン内のパーセント記号("% ")は0以上のシーケンスと一致します文字列内の文字。パターン内の下線( "_")は、文字列内の任意の1文字と一致します。他の文字は、 それ自体またはその大文字/ 小文字に 一致します(つまり、大文字と小文字を区別しない一致)。(バグ:SQLiteは、 ASCII文字の大文字/小文字。LIKE演算子は、ASCIIの範囲を超えるUnicode文字の大文字と小文字を区別します。たとえば、式 'a' LIKE 'A'はTRUEですが、 'æ' LIKE 'Æ'はFALSEです。」
これはsqliteに固有のものではありませんが、あなたはただ行うことができます
SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')
別のオプションは、独自のカスタム照合を作成することです。次に、その照合を列に設定するか、選択句に追加できます。順序付けと比較に使用されます。
これは、「VOILA」を「voilà」のように作成するために使用できます。
http://www.sqlite.org/capi3ref.html#sqlite3_create_collation
照合関数は、最初の文字列が2番目の文字列より小さい、等しい、または大きい場合、それぞれ負、ゼロ、または正の整数を返す必要があります。
簡単に言うと、SELECTクエリでCOLLATE NOCASEを使用できます。
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
同様のクエリを使用して、それぞれの文字列をテーブル値と比較できます。
'それぞれの比較値'のような列名であるtable_nameから列名を選択します。