1. ホーム
  2. sqlite

[解決済み] Sqlite3の文字列比較で大文字・小文字を区別しない設定にするには?

2022-03-16 02:56:38

質問

sqlite3データベースから文字列照合でレコードを選択したいです。しかし、where節で'='を使用すると、sqlite3は大文字と小文字を区別することがわかりました。どなたか、大文字と小文字を区別しない文字列比較の方法を教えていただけませんか?

解決方法は?

を使用することができます。 COLLATE NOCASE の中で SELECT のクエリを作成します。

SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE

さらに、SQLite では、テーブルを作成するときに、大文字小文字を区別しないカラムを指定することができます。 collate nocase をカラムの定義に追加します (他のオプションは binary (デフォルト)と rtrim をご覧ください。 ここで ). を指定することができます。 collate nocase を作成する際にも、同様にインデックスを作成します。 例えば

create table Test
(
  テキスト値 テキスト 照合順序 nocase
);

insert into Test values ('A');
insert into Test values ('b')(テストの値に挿入する)。
insert into Test values ('C');

インデックス Test_Text_Value_Index を作成する。
  をテストします(Text_Value collate nocase)。

を含む式 Test.Text_Value は、大文字と小文字を区別しないようになりました。 例えば

sqlite> select Text_Value from Test where Text_Value = 'B';
テキスト値      
----------------
b               

sqlite> select Text_Value from Test order by Text_Value;
テキスト値      
----------------
A               
b               
C    

sqlite> select Text_Value from Test order by Text_Value desc;
テキスト値      
----------------
C               
b               
A               

オプティマイザは、大文字小文字を区別しない検索やカラムのマッチングにインデックスを使用できる可能性もあります。 これを確認するには explain SQLコマンドなど。

sqlite> explain select Text_Value from Test where Text_Value = 'b';
アドラ オペコード p1 p2 p3                               
---------------- -------------- ---------- ---------- ---------------------------------
0 ゴトー 0 16                                           
1 整数 0 0                                            
2 OpenRead 1 3 keyinfo(1,NOCASE)                
3 SetNumColumns 1 2                                            
4 String8 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                                            
17 ベリファイドクッキー 0 4                                            
18 後藤 0 1                                            
19 Noop 0 0