たまに使うのにどう使うのかを度忘れすることがあるので備忘録。
前提
テーブルから値を取得する際の条件としてWHERE句を設定するが、検索対象によってWHERE句に指定する検索条件が増減しうる。
例えば生徒の情報(氏名、性別等)を保持するテーブル STUDENT
があったとして、全件取得したければ条件を付ける必要がないので
SELECT * FROM STUDENT
で済む。
これに対し氏名の姓だけを検索条件に加えるなら
SELECT * FROM STUDENT
WHERE 氏名 LIKE '(姓)%'
となる。
プログラムでデータを取得する場合、条件の組み合わせごとにSQLをそれぞれ用意するような非効率なことはしたくないので、WHERE
以降の検索条件を動的につなげたい。
SQLは検索条件がない場合は WHERE
があるとエラーになるため、検索条件がある場合と検索条件がない場合で条件分岐が必要になる。
この時に便利なのが(1=1)、(1=0)となる。
WHERE (1=1)
1=1は当然正しいのでtrue。
SELECT * FROM STUDENT
WHERE (1=1)
この場合、(1=1)が検索条件となり、必ずtrueであるため、STUDENTテーブル上のすべてのレコードを取得することになる。
検索条件が存在する場合、
SELECT * FROM STUDENT
WHERE (1=1)
AND 氏名 LIKE '(姓)%'
のように(1=1)以降にANDで条件を追加していけば良い。
なおMySQLではWHERE 1 でも同じことになる模様。
WHERE (1=0)
(1=1)の場合、以降に検索条件がなければ全件取得されるが、条件がない場合は一件も値を取得してほしくない場合もある。
その場合は(1=0)を用いる。
SELECT * FROM STUDENT
WHERE (1=0)
この場合、(1=0)はfalseであるため、STUDENTテーブル上のレコードを1件も取得しない。
SELECT * FROM STUDENT
WHERE (1=0)
OR 氏名 LIKE '(姓)%'
のように、OR (検索条件) として条件を付与することで、検索条件に適合するレコードがあればそれだけを取得する。
なお、bool値としてfalseになればいいわけなので、別に(2=0)でもなんでもよい。MySQLなら0でもOK。が、ややこしいので(1=0)にするのが無難。