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

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

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

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

Q&A

解決済

1回答

4208閲覧

MySQLのSELECT文の条件で記号が含まれた値をヒットさせたい

Yossyu

総合スコア8

MySQL

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

0グッド

1クリップ

投稿2017/04/25 06:38

MySQLの条件定義で表題の件が可能なのかどうか、調べたのですがわからなかったのでご教授いただきたいです。

#やりたいこと
下記のような値が格納されたDBがあります

tb_actor

noname
1ジョニー・デップ
2オーランド・ブルーム
3ハリー・ポッター

「ジョニー」とか「デップ」などで検索された時はLIKE検索で1のレコードをヒットすることはできるのですが「ジョニーデップ」と入力があった時に記号の「・」があるため、ヒットさせることはできません。

SQL

1SELECT * FROM tb_actor WHERE name LIKE '%ジョニーデップ%';

※記号は・だけでなく一般的な記号全般($#_-*など)を含みます。

そもそも記号が含まれている値に対して記号無しのワードでLIKE検索はできないのでしょうか。

表題の件、できる・できないを含めてご教授いただけないでしょうか。

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

たとえば「ジョニー・デップ」で「ジョ・ニーデップ 」までヒットして良いかという問題です。
問題ないならreplaceを利用して「ジョニーデップ 」に加工した後、
ヒットさせればよいですが、インデックスなど効かないのであまり
効率的な検索にはなりません。

追記

SQL

1create table tb_actor(no int unique,name varchar(30)); 2 3insert into tb_actor values 4(1,'ジョニー・デップ'), 5(2,'ジョニーデップ'), 6(3,'ジョニー/デップ'), 7(4,'ジョ#ニーデップ'), 8(5,'ジ__・--ョ$ニ#$$ー_デ-ッ******プ'), 9(6,'ジョ・ニーデップ'), 10(11,'オーランド・ブルーム'), 11(21,'ハリー・ポッター'); 12

として、「・#_-$*」を除く場合こんな感じ

select no ,name from tb_actor where replace( replace( replace( replace( replace( replace(name,'・','') ,'$','') ,'#','') ,'_','') ,'-','') ,'*','') like '%ジョニーデップ%'

function

汎用性のためfunctionを使います
まずストアードファンクション(replace2)を作成します

sql

1drop function if exists replace2; 2delimiter // 3create function replace2(str varchar(255), pattern varchar(20), replacement varchar(20)) returns varchar(255) DETERMINISTIC 4begin 5DECLARE x INT DEFAULT 0; 6DECLARE i INT DEFAULT 1; 7set x=length(pattern); 8while i<=x 9do 10set str=replace(str,substr(pattern,i,1),replacement); 11set i=i+1; 12end while; 13return str; 14end 15// 16delimiter ; 17

functionを利用した実行

sql

1select no 2,name from tb_actor 3where replace2(name,'・$#_-*','') like '%ジョニーデップ%';

投稿2017/04/25 06:49

編集2017/04/25 08:33
yambejp

総合スコア114777

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

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

Yossyu

2017/04/25 07:05

ありがとうございます。 曖昧なヒット重視なので、極端な話であれば 「ジョニーデップ」という検索ワードに対して 「ジョニー・デップ」でも「ジョ・ニーデップ」でも「ジョニーデッ・・プ」でもヒットしても構わないです。 replaceも考えたのですが、記述方法がわかりませんでした。 ご教授いただけないでしょうか。 よろしくお願いいたします。
Yossyu

2017/04/25 08:00 編集

ありがとうございます! その記述はまったく思いつかなかったです。 replaceに関しては記号の数だけ入れ子にしていくしか方法はなさそうでしょうか。 実際に記号が20個あれば20回、なおかつ対象がname以外もあればそれら全てに同じ記述が必要でしょうか。
yambejp

2017/04/25 08:34

functionを利用したサンプルを挙げておきます。 mysqlのfunction指定は若干なれていないとわかりづらいかもしれません
Yossyu

2017/04/25 13:39

ありがとうございます! mysqlのfunctionは初めて目にしました。。。 貴重なアドバイスありがとうございます。 内容を把握するのになかなか難しそうですが実際に動かしてみて 理解したいと思います。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問