344

文字列マッチングでsqlite3データベースからレコードを選択したい。しかし、where 句で「=」を使用すると、sqlite3 では大文字と小文字が区別されることがわかりました。大文字と小文字を区別しない文字列比較の使い方を教えてもらえますか?

4

11 に答える 11

556

クエリで使用でき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 照合 nocase);

関係する式Test.Text_Valueは、大文字と小文字を区別しないようになりました。例えば:

sqlite> Test から Text_Value を選択します。ここで、Text_Value = 'B';
Text_Value      
----------------
b               

sqlite> Test order by Text_Value から Text_Value を選択します。
Text_Value      
----------------
あ               
b               
ハ    

sqlite> Test order by Text_Value desc から Text_Value を選択します。
Text_Value      
----------------
ハ               
b               
あ               

オプティマイザーは、大文字と小文字を区別しない検索と列の照合にインデックスを利用することもできます。explainこれは、次のようなSQL コマンドを使用して確認できます。

sqlite> 説明 select Text_Value from Test where Text_Value = 'b';
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 メモリストア 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                                            
于 2009-06-10T05:22:25.607 に答える
150
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
于 2009-06-10T05:17:56.017 に答える
51

次のように実行できます。

SELECT * FROM ... WHERE name LIKE 'someone'

(解決策ではありませんが場合によっては非常に便利です)

LIKE演算子はパターン マッチング比較を行います。右側のオペランドにはパターンが含まれ、左側のオペランドにはパターンと照合する文字列が含まれます。パターン内のパーセント記号 ("%") は、0 以上の任意のシーケンスに一致します。文字列内の文字. パターン内のアンダースコア ("_") は、文字列内の任意の 1 文字に一致します.他の文字は、 それ自体またはそれに相当する小文字/大文字に一致します (つまり、大文字と小文字を区別しない 一致) . (バグ: SQLite のみが理解しますASCII 文字の大文字/小文字. LIKE 演算子は、ASCII 範囲外の Unicode 文字の大文字と小文字を区別します. たとえば、式 'a' LIKE 'A' は TRUE ですが、'æ' LIKE 'Æ' はは FALSE です。)」

于 2009-06-10T04:18:05.957 に答える
42

これは sqlite に固有のものではありませんが、単に行うことができます

SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')
于 2009-06-10T03:21:50.087 に答える
6

もう 1 つのオプションは、独自のカスタム照合を作成することです。次に、その照合順序を列に設定するか、選択句に追加できます。注文と比較に使用されます。

これを使用して、「VOILA」を「voilà」のようにすることができます。

http://www.sqlite.org/capi3ref.html#sqlite3_create_collat​​ion

照合関数は、最初の文字列が 2 番目の文字列より小さい、等しい、または大きい場合、それぞれ負、ゼロ、または正の整数を返す必要があります。

于 2014-10-21T17:27:11.933 に答える
0

列がタイプの場合、照会する値にスペースを追加する必要があります。こちらcharの質問を参照してください。これは、または他のソリューション (upper() など) のいずれかを使用することに加えて。COLLATE NOCASE

于 2013-05-01T07:28:06.593 に答える
0

それは私のために完璧に働いています。 SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE

于 2017-09-20T09:29:42.763 に答える
-1

like クエリを使用して、それぞれの文字列をテーブルの値と比較できます。

「それぞれの比較値」のような列名のtable_nameから列名を選択します。

于 2017-06-29T04:20:24.640 に答える