🙆‍♀️

SQL - WHEREの条件を簡潔に書く(WHERE 1=1)

2025/01/29に公開

業務で触れているコード中にWHERE 1=1という記述を見つけました。
これは、WHEREの条件を簡潔に書くためのテクニックだということを知り、そのことについて調べたことをまとめます。言語はRuby(Rails)で記述します。

WHERE 1=1でなぜ簡潔に書ける?

1=1trueになるので、後続の条件を全て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=1trueとなるため、後続の条件を全てANDで繋げることができます。
なので、パラメータによる条件追加がANDで統一できるので完結に可読性高く書くことができます。

これがWHERE 1=1を使うメリットになります。

まとめ

WHERE 1=1 は動的にクエリを構築する際に役立つテクニックです。

  • 動的なクエリ構築が簡単になる
  • 条件がゼロの場合でもエラーにならない
  • コードの可読性、保守性がよくなる

といったメリットがある、ということがわかりました。

Discussion