Pandora Pocket

IT系と日常系の備忘録。三日坊主。

たまに使うのにどう使うのかを度忘れすることがあるので備忘録。

前提

テーブルから値を取得する際の条件として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)にするのが無難。