質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

1827閲覧

mysqlの検索で、1文字をor検索する方法

raguel

総合スコア25

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2016/11/19 13:15

mysqlの検索で、1文字をor検索として検索したいと思います。

SELECT * FROM `test` WHERE `name` LIKE '%斉藤%' or `name` LIKE '%齊藤%' or `name` LIKE '%齋藤%' or `name` LIKE '%斎藤%';

ではなく、

SELECT * FROM `test` WHERE `name` LIKE '%(斉 or 齊 or 齋 or 斎)藤%';

という様なイメージで記述したいのですが、どの様に記述すれば良いのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ここは素直に

sql

1SELECT * FROM `test` WHERE `name` LIKE '%斉藤%' or `name` LIKE '%齊藤%' or ...;

と記述する方が良いと、私は考えます。


Kosuke_Shibuya様の回答のように、正規表現を使うと以下のように記述できますが、

sql

1SELECT * FROM test WHERE name REGEXP ('[斉齊齋斎]藤');

MySQLのマニュアルには、以下のように説明されているからです。
https://dev.mysql.com/doc/refman/5.6/ja/regexp.html#operator_regexp

警告

REGEXP および RLIKE 演算子はバイト単位で機能するため、マルチバイトセーフではなく、マルチバイト文字セットを使用すると想定外の結果が生成される可能性があります。

実際、上述の正規表現では意図通りに動作しないケースがあります。
(以下、MySQL5.7で確認)

sql

1mysql> CREATE TABLE test ( 2 -> name varchar(32) DEFAULT NULL 3 -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 4Query OK, 0 rows affected (0.03 sec) 5 6mysql> INSERT INTO test VALUES ('キヤノン'), ('キャノン'); 7Query OK, 2 rows affected (0.01 sec) 8Records: 2 Duplicates: 0 Warnings: 0 9 10 11mysql> SELECT * FROM test; 12+--------------+ 13| name | 14+--------------+ 15| キヤノン | 16| キャノン | 17+--------------+ 182 rows in set (0.00 sec) 19 20 21mysql> SELECT * FROM test WHERE name REGEXP('キ[ヤャ]ノン'); 22Empty set (0.00 sec)

一応、このケースでも以下のように正規表現を書き換えると意図通りに動作しましたが、
こちらも意図通りに動作しないケースが無いとも言えません。

sql

1mysql> SELECT * FROM test WHERE name REGEXP ('キ(ヤ|ャ)ノン'); 2+--------------+ 3| name | 4+--------------+ 5| キヤノン | 6| キャノン | 7+--------------+ 82 rows in set (0.00 sec)

投稿2016/11/20 09:28

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

正規表現検索が最も近い検索方法かと思います。
文字列正規表現演算子

投稿2016/11/19 13:23

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問