プロが教えるわが家の防犯対策術!

tbというテーブルのbangというカラムに4が含まれていれば表示というのは
select * from tb where (bang) like '%4%' ;

という形になりますが、このtbテーブルにさらにname,tukiというカラムがあったとして
カラムに関係なくレコードのどこかに4が入っていれば抽出するというSQL文が書きたいです。

select * from tb where bang like '%4%' or name like '%4%' or tuki like '%4%' ;

と書くことで何とか今まではやってきたのですが、カラム数が増えてきてしまったので、ものすごく長いSQL文なってしまいました。
もう少しスマートにする方法はありませんか?

A 回答 (2件)

>like '%4%'



のような前方後方一致はSQLの不得意分野で基本的にインデックスはきかないため、
なにをやっても高速化は期待できません

遅くても気にしないなら適当なセパレータを使って連結してからlikeを使えば
書式はすっきりします(さらにスピードはおちると思いますが・・・)


select * from tb where
concat_ws(char(0),bang,name,tuki) like '%4%;

ただし、この場合もbang,name,tukiは文字列型のカラムでnullがないことが前提になります
そうでない場合は例外処理をいくつかかます必要があるでしょう
    • good
    • 0
この回答へのお礼

できました。ありがとうございます。

お礼日時:2013/06/11 22:51

「複数カラムで、LIKE "%検索語%"」 を上の検索欄に入れると、結構頻出質問のようですよ。


簡単に言うと、検索対象カラムを全部文字列連結(mysqlではconcat関数を使う)して like "%検索語%" で比較する。
カラム名をつぶさに並べないとならないのは同じだけど、like 以降は一回でよい。
しかし、実行時間は、like条件をorで繋げるのと替わらないか、逆に遅くなるか。いずれにしても対象行が増えるととても遅くなります。千行くらいでは、あんまり実感しないけど、万を超えるとやはり体感的にも遅い。。。
ほかにも、いくつか注意点が有るので、上記でヒットしたページの回答もつぶさに読んでください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す