LIKE演算子の対象にカラム名を使いたいとき。

…これも文字だけで説明しても伝わりにくいので、実データで^^;


「A」「B」という二つのテーブルが存在すると仮定して、LIKEを使ったSQLを実行する際
よくあるケースは、

SELECT id, name, address FROM A WHERE email LIKE 'choo%';
SELECT id, name, address FROM B WHERE email LIKE '%choo';
SELECT id, name, address FROM A WHERE email LIKE '%choo%';

…のように、前方一致、後方一致、途中(?)一致いずれの場合も固定文字列と組み合わせる
ものではないでしょうか?
プログラム上でSQLを実行させる場合等は、ほとんど上記のパターンだと思います。
(少なくとも私はそうでした…)
※「%」はMySQLではワイルドカードになります☆


ところが現在携わっているプロジェクトでは、膨大な量のデータが格納されたテーブルから
コマンドラインでSQLを叩いて結果を得る、というもので、上の例で言えば、

Aの「email」というカラムの値が、Bの「email」というカラムに前方一致するかどうか

…のように、LIKE演算子を使いたい対象が固定文字列ではないんです(´・ω・`)


そんな時、どうするのか…


concatを使うんですね(・∀・)

SELECT id, name, address FROM A, B WHERE A.email LIKE concat(B.email, '%');

  1. 前方一致⇒concat(カラム名, '%')
  2. 後方一致⇒concat('%', カラム名)
  3. 途中一致⇒concat('%', カラム名, '%')


以上の方法は便利なのですが、欠点が1つありまして、それは…
LIKE演算子対象のカラムに張られたインデックスが無効になってしまう
というものです(´・ω・`)
少量のデータを扱う場合はそれほど気にならないんでしょうけど、今回のように数百万〜数千万件の
データに対してインデックスが使えないのは辛いです…