LIKE演算子:パターンマッチングでデータベースを検索
SQLiteにおけるLIKE演算子とワイルドカード%と_
ワイルドカード%と_
LIKE演算子では、2つのワイルドカード文字(メタ文字)を使用できます。
- %: 0文字以上の任意の文字列に一致します。
- _: 1文字に一致します。
これらのワイルドカードを使用して、さまざまな検索パターンを作成できます。
例
名前に「山田」を含むレコードを検索
SELECT * FROM users WHERE name LIKE '%山田%';
このクエリは、名前が「山田」で始まる、または「山田」を含む、または「山田」で終わるレコードをすべて返します。
電話番号が7桁で始まるレコードを検索
SELECT * FROM customers WHERE phone_number LIKE '_ _ _ _ _ _ _';
このクエリは、電話番号が7桁で始まり、残りの桁が数字であるレコードをすべて返します。
SELECT * FROM users WHERE email LIKE '%@example.com';
注意事項
- LIKE演算子は、大文字と小文字を区別しません。
- ワイルドカード文字は、エスケープ文字を使用して、リテラルとして使用できます。
- LIKE演算子は、パターンマッチングに特化しており、正規表現ほど強力ではありません。
LIKE演算子とワイルドカード文字は、SQLiteデータベースで特定の文字列を含む、または特定のパターンに一致するレコードを検索するための強力なツールです。これらのツールを理解することで、データ分析や検索機能を強化することができます。
-- テーブルの作成
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
email TEXT
);
-- データの挿入
INSERT INTO users (name, email) VALUES ('山田太郎', '[email protected]');
INSERT INTO users (name, email) VALUES ('佐藤花子', '[email protected]');
INSERT INTO users (name, email) VALUES ('田中一郎', '[email protected]');
-- 名前が「山田」を含むレコードを検索
SELECT * FROM users WHERE name LIKE '%山田%';
-- 電話番号が7桁で始まるレコードを検索
SELECT * FROM users WHERE phone_number LIKE '_ _ _ _ _ _ _';
-- [メールアドレスを削除しました]」で終わるレコードを検索
SELECT * FROM users WHERE email LIKE '%@example.com';
このコードを実行すると、以下の結果が出力されます。
| id | name | email |
|-----|---------|-------------------------|
| 1 | 山田太郎 | [email protected] |
このサンプルコードは、LIKE演算子とワイルドカード%と_を使用して、さまざまな検索パターンを作成する方法を示しています。
SELECT * FROM users WHERE name LIKE '%山田%' OR name LIKE '%佐藤%';
SELECT * FROM users WHERE phone_number LIKE '_ _ _ _ _ _ _' OR phone_number LIKE '_ _ _ _ _ _ _ _';
- メールアドレスが「example.com」ドメインを持つレコードを検索
SELECT * FROM users WHERE email LIKE '%@example.com';
これらの例は、LIKE演算子の使い方を理解するための参考としてください。
LIKE演算子の代替方法
正規表現
SQLiteは、REGEXP演算子を使用して正規表現によるパターンマッチングを行うことができます。正規表現は、LIKE演算子よりも複雑なパターンを表現できるため、より柔軟な検索が可能です。
例
-- 名前が「山田」で始まるレコードを検索
SELECT * FROM users WHERE name REGEXP '^山田';
-- 電話番号が7桁で始まるレコードを検索
SELECT * FROM users WHERE phone_number REGEXP '^_ _ _ _ _ _ _';
-- [メールアドレスを削除しました]」で終わるレコードを検索
SELECT * FROM users WHERE email REGEXP '@example.com$';
INSTR関数は、文字列内の指定された文字列の位置を返します。この関数を使用して、部分一致検索を行うことができます。
-- 名前が「山田」を含むレコードを検索
SELECT * FROM users WHERE INSTR(name, '山田') > 0;
-- 電話番号が7桁で始まるレコードを検索
SELECT * FROM users WHERE INSTR(phone_number, '_ _ _ _ _ _ _') = 1;
-- [メールアドレスを削除しました]」で終わるレコードを検索
SELECT * FROM users WHERE INSTR(email, '@example.com') = LENGTH(email) - LENGTH('@example.com') + 1;
SUBSTR関数は、文字列の一部を抽出します。この関数を使用して、前方一致検索や後方一致検索を行うことができます。
-- 名前が「山田」で始まるレコードを検索
SELECT * FROM users WHERE SUBSTR(name, 1, 2) = '山田';
-- 電話番号が7桁で始まるレコードを検索
SELECT * FROM users WHERE SUBSTR(phone_number, 1, 7) = '_ _ _ _ _ _ _';
-- [メールアドレスを削除しました]」で終わるレコードを検索
SELECT * FROM users WHERE SUBSTR(email, -10) = '@example.com';
どの方法を使うべきかは、検索するパターンと、必要なパフォーマンスによって異なります。
- LIKE演算子は、単純なパターンマッチングに適しています。
- INSTR関数は、部分一致検索に適しています。
パフォーマンスに関しては、一般的に正規表現が最も遅く、LIKE演算子が最も速くなります。
LIKE演算子には、いくつかの代替方法があります。それぞれの方法の特徴を理解して、状況に応じて使い分けることが重要です。
sql sqlite sql-like