🙆♀️
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