プログラムでSQLを組み立てる処理中に
- SELECT * FROM table_name WHERE 1
- SELECT * FROM table_name WHERE 1 = 1
という記述を見ることがあります。
これは機能的には SELECT * FROM table_name;
と何ら変わりない。
WHERE 1
MySQLでは整数の1はTRUEと等価である。
WHERE 1 = 1
(1 = 1) を評価すると当然TRUEなのでWHERE 1
とWHERE 1 = 1
は全く同じ結果となる。
そしてWHEREで指定する条件が必ず真であるならば、すべての行が選択されるので、
WHERE を指定しない、SELECT * FROM table_name;
と結果は同じになる。
ではSELECT * FROM table_name;
と
SELECT * FROM table_name WHERE 1
は同じ結果となるのに、
何故わざわざWHERE 1
を書くのかというと、そのほうがプログラミングするうえで都合がいいからです。
SQLで条件を指定する時、1つ目の条件はWHERE句で指定し、2つ目以降の条件はANDかORで指定します。
SELECT * FROM テーブル名 WHERE 1つ目の条件 AND 2つ目の条件 AND 2つ目の条件 ...
SQLを組み立てるときに「それが1つ目の条件ならばWHEREで指定する」という処理が面倒なので、
あらかじめ WHERE = 1 という全ての行にマッチする条件をつけておいて、
それ以外の条件を足していくようにしておいたほうが、簡単なのです。
次のような条件でusersテーブルをemailとnameで絞り込み検索をするプログラムを書くとしましょう。
- emailだけが指定されて入れば、emailだけで検索
- nameだけが指定されて入れば、nameだけで検索
- emailとnameが指定されていれば、emailとnameのAND検索
このようにクエリを組み立てたい場合はWHERE 1
があるほうがシンプルになる。
WHERE 1 無し:
$sql = "SELECT * FROM users";
if($email){
$sql .= " WHERE email = :email";
}
if($name){
if($email){
$sql .= " AND name = :name";
}
else{
$sql .= " WHERE name = :name";
}
}
WHERE 1 あり:
$sql = "SELECT * FROM users WHERE 1";
if($email){
$sql .= " AND email = :email";
}
if($name){
$sql .= " AND name = :name";
}