SQL | Where 0=0の目的

SQL | Where 0=0の目的

クエリのWhere文でたまに見かける「Where 0=0」について備忘録として記載します。

データ取得の条件を作成する

例えば下図のような「商品」テーブルを考えます。

0=0の意味

普段のクエリ作成では利用しないと思いますが、プログラム作成時には意外と便利だったりします。

where 0=0

Select * from 商品 where 0=0 の意味は「条件(0=0)がTrueの時にSelect Allしてね」という指示になります。

0=0は明らかにTrueなので、Slect Allとなります。

0=0でも100=100でもなんでも良いです。

どういうときに便利か?→ プログラムでクエリを生成する場合

プログラムでクエリを生成する場合を想定し、以下のような条件分岐が発生するとします。

・検索フォームに何も入力されていない状態で検索ボタンを押下

 → 全件出力

・検索フォームに入力されている状態で検索ボタンを押下

 → 条件検索

プログラムでクエリを生成する場合を考えます。

0=0を利用しない場合

1)文字列 = “Select * from 商品”

2)判別ロジック:検索フォームに値が入っているか否か?

  ↓入っている場合

  2-1)文字列 += Where

  3)判別ロジック:条件セットは1個目か否か?

   ↓1個目

   3-1)文字列 += 条件セット[1](例:カテゴリ=”果物”)

   ↓2個目以降

   3-2)文字列 += and

   3-3)文字列 += 条件セット[2](例:単価>=100)

条件セットの1個目だけは、andを付けずに、2個目以降はandを付与する、といった制御が必要なので、1個目、2個目以降を判別するロジックが必要です。

0=0を利用する場合

※あらかじめ、条件セットを作成しておく。

1)文字列 = “Select * from 商品 where 0=0”

2)判別ロジック:検索フォームに値が入っているか否か?

  ↓入っている場合

  2-1)文字列 += 条件セット[1](例: and カテゴリ=”果物”)

  2-2)文字列 += 条件セット[2](例:and 単価>=100)

条件セットの1個目、2個目に関わらず、常にandを付与する、といった制御が必要ですが、1個目、2個目を判別するロジックを省略することができます。

上記「0=0を使用しない場合」よりもシンプルにコーディングできます。

おまけ:where 1=0

Select * from 商品 where 1=0 の意味は「条件(1=0)がTrueの時にSelect Allしてね」という指示になります。

1=0は明らかにFalseなので、この状態では何も出力されません。

この書き方を利用する目的は、

・条件を入れない場合は何も表示しない

・条件を入れた場合だけ対象の項目を表示する

といった制御を行うことができます。

Orでつなげる

Select * from 商品 where 1=0 or カテゴリ=”果物”

初期表示は何も表示されませんが、検索項目を入れることで初めて値を取得できるようになります。

ただし、複数条件を入れるとなると、ちょっと複雑になるのであまり実用的ではないかもしれません。

今回は以上です。