HOWTO · SQLite

Sqlite3 での大文字と小文字を区別しない文字列比較

この記事では、SQLite バージョン 3 での大文字と小文字を区別しない文字列比較について説明します。

このページの内容

SQLite データベース エンジンは C 言語で開発されています。 スタンドアロンのアプリケーションではありません。 むしろ、アプリケーション開発者がアプリケーションを実装するために使用できるライブラリです。

MySQL と同様に、SQLite もリレーショナル データベース管理システム (RDBMS) であり、SQL (構造化クエリ言語) に実装されています。 SQLite のバージョン 3 では、データベースは文字列の照合時に大文字と小文字を区別するため、ユーザーが = (単一の等号) 演算子を where 句で使用してデータベースからレコードを選択すると、SQLite データベースはそれが 大文字と小文字を区別。

Sqlite3 で大文字と小文字を区別しない文字列比較を実装する

このような状況に対処するために、SQLite データベースを操作するさまざまな方法があります。

  1. CREATE または SELECT クエリ ステートメントで collate nocase 句をよく使用します。
  2. もう 1つのオプションは、LIKE 演算子を使用することです。これは、文字列オペランドを比較するときに大文字と小文字を区別しません。
  3. 最後に、= 演算子で文字列を比較するときに、オペランドの両側で UPPER() および LOWER() 関数を使用します。

Sqlite3 で大文字と小文字を区別しない文字列比較を行うには、CREATE クエリで COLLATE NOCASE を使用する

データ型としてテキスト (文字列) が追加されたさまざまなレコードを持つデータベースがあるとします。 ここで、= 演算子を使用してテーブルからいくつかのレコードを選択すると、データベースはレコードが大文字と小文字を区別することを示します。

したがって、一般的に、SQLite では、collate nocase クエリを使用してテーブルを作成するときに、列の大文字と小文字を区別しないようにする必要があります。 テーブル内の ID またはインデックス値で collate nocase を指定することもできます。

以下の例では、example.New_text は大文字と小文字を区別しません。

create table example
(
  New_text text collate nocase
);

insert into example values ('ABC');
insert into example values ('def');
insert into example values ('GHI');

create index example_New_text_Index
  on example (New_text collate nocase);

テーブルexampleにいくつかのレコードを作成して挿入したら、selectクエリでレコードを取得して、大文字と小文字の区別をテストできます。 以下の結果は、where 句で文字列データ型を比較するために大文字と小文字を区別しない必要がある場合は常に、collate nocase が正常に機能することを示しています。

例 1:

SELECT New_Text FROM example WHERE New_Text = 'DEF';

出力:

def

例 1 では、= 演算子を where 句で使用すると、表内の大文字と小文字を区別する値を考慮せずに def 値が返されます。 その理由は、テーブルの作成時に collate nocase を使用すると、列 New_text の値の大文字と小文字が区別されなくなるためです。

例 2:

SELECT New_Text FROM example ORDER BY New_Text;

出力:

ABC
def
GHI

例 3:

SELECT New_Text FROM example ORDER BY New_Text DESC;

出力:

GHI
def
ABC

SQLite データベースで EXPLAIN コマンドを使用する

列のインデックスを使用して、大文字と小文字を区別する一致と検索を確認することもできます。 この目的のために EXPLAIN コマンドを使用します。

EXPLAIN SELECT New_Text FROM example WHERE New_Text = 'def';

出力:

addr              opcode          p1          p2
1                 Integer         0           0
2                 OpenRead        1           3
3                 SetNumColumns   1           2
4                 String8         0           0
5                 IsNull          -1          14
6                 MakeRecord      1           0
7                 MemStore        0           0
8                 MoveGe          1           14
9                 MemLoad         0           0
10                IdxGE           1           14
11                Column          1           0
12                Callback        1           0
13                Next            1           9
14                Close           1           0
15                Halt            0           0
16                Transaction     0           0
17                VerifyCookie    0           4
18                Goto            0           1
19                Noop            0           0

Sqlite3 で大文字と小文字を区別しない文字列比較を行うには、SELECT クエリで COLLATE NOCASE を使用する

大文字と小文字の区別の問題を考慮せず、collate nocase 句を使用せずにテーブルを作成するとします。 次に、SELECT クエリでレコードを取得する際に collate nocase 句を引き続き使用できます。

この例では、collate nocase 句を SQLite の SELECT ステートメントで使用できることがわかります。

SELECT * FROM NameOfTheTable WHERE value = 'MatchingValue' COLLATE NOCASE

Sqlite3 での大文字と小文字を区別しない文字列比較のための LIKE 演算子の使用

collate nocase 句と同様に、LIKE 演算子を使用して、SQLite データベースの文字列型の大文字と小文字を区別しない比較を行うことができます。

LIKE 演算子はパターン マッチング演算子です。 通常の演算子と同様に、比較用に左側と右側のオペランドがあります。

左側のオペランドには一致する文字列が含まれ、右側のオペランドには一致する文字列と一致するパターンが含まれます。 この演算子には、特定の文字の任意の数のシーケンスのパーセント記号 % も含まれています。

LIKE 演算子も大文字と小文字を区別しないため、照合に大文字または小文字のどちらを使用しても問題ありません。 ASCII コード文字ではなく、Unicode 文字でのみ大文字と小文字が区別されます。

たとえば、LIKE 演算子では、ASCII 文字の A と a は同じですが、Unicode 文字の Æ と æ は異なります。 LIKE 演算子を使用して、SQLite データベース内の大文字と小文字を区別しないレコードを比較します。

SELECT * FROM NameOFTheTable WHERE Value LIKE 'something'

Sqlite3 で大文字と小文字を区別しない文字列比較に LOWER() または UPPER() 関数を使用する

特定の列に大文字と小文字の値を持つレコードがあるとします。 ただし、SELECT ステートメントで = 演算子を使用して値を比較すると、結果で大文字と小文字が区別される問題があります。

この問題に対処するために、SQLite 関数 LOWER() および UPPER() を実装できます。ここで、LOWER() 関数はすべての文字に対して小文字であり、UPPER() 関数はすべての文字に対して大文字です。 提供された文字列の。 これらの関数をSELECTステートメントで使用して、それらを有効にします。

以下の例は、一致する文字列が最初に LOWER() 関数を使用して小文字に変換され、UPPER() 関数を使用すると大文字に変換されることを示しています。

SQLite で UPPER() 関数を使用する:

SELECT * FROM NameOFTheTable WHERE UPPER(value) = UPPER('something')

SQLite で LOWER() 関数を使用する:

SELECT * FROM NameOFTheTable WHERE LOWER(value) = LOWER('something')