🙆♀️
SQL - WHEREの条件を簡潔に書く(WHERE 1=1)
業務で触れているコード中にWHERE 1=1
という記述を見つけました。
これは、WHEREの条件を簡潔に書くためのテクニックだということを知り、そのことについて調べたことをまとめます。言語はRuby(Rails)で記述します。
WHERE 1=1でなぜ簡潔に書ける?
1=1
はtrue
になるので、後続の条件を全てAND
で繋げることができるため簡潔なコードで書くことができます。
以降でその理由を書いていきます。
WHERE 1=1
は、動的にクエリを組み立てる際に役立つテクニックです。
id | name | age | status |
---|---|---|---|
1 | user 1 | 20 | 1 |
2 | user 2 | 30 | 0 |
上記のようなテーブルから、条件に合ったデータを取得するクエリを動的に作る場合を考えてみます。
WHERE 1=1
を使わない例
1=1
を使わない場合は、以下のように取得できます。(SQLインジェクション等は考慮しないコードです)
condtions = []
conditions << 'age > #{params[:age]}' if params[:age]
conditions << 'status = #{params[:status]}' if params[:status]
query = conditions.any? ? conditions.join(" AND ") : ""
@users = User.where(query)
作られるクエリ例
'age > 20 AND status = 1'
このコードは、パラメータに応じてwhere
メソッドによるクエリを構築する処理をしています。どのような条件が作られている分かりにくい上、conditions
配列を展開するかどうかの判定の処理も必要になります。
WHERE 1=1
の例
以下は、1=1
を使う場合です。
query = "1=1"
query += ' AND age > #{params[:age]}' if params[:age]
query += ' AND status = #{params[:status]}' if params[:status]
@users = User.where(query)
作られるクエリ例
'1=1 AND age > 20 AND status = 1'
1=1
はtrue
となるため、後続の条件を全てAND
で繋げることができます。
なので、パラメータによる条件追加がAND
で統一できるので完結に可読性高く書くことができます。
これがWHERE 1=1
を使うメリットになります。
まとめ
WHERE 1=1
は動的にクエリを構築する際に役立つテクニックです。
- 動的なクエリ構築が簡単になる
- 条件がゼロの場合でもエラーにならない
- コードの可読性、保守性がよくなる
といったメリットがある、ということがわかりました。
Discussion