WHERE 1またはWHERE 1 = 1を使用する理由


50

通常、クエリステートメントで条件が必要ない場合は、WHERE句を使用しません。しかしWHERE 1、他の条件が存在しない場合でも、多くの場所で句が使用されているのを見てきました。

  • なぜこれが行われるのですか?
  • 実行時間に特定の利点はありますか?
  • 他の機能を有効にしますか?
  • WHERE 1=1これに似たものを使用していますか?

回答:


45

基本的には、プログラマーの利便性のためだけで、AND...その後追加の条件を追加するだけで、実行時間には影響しません。

Stackoverflowへのこれらのリンクを確認してください。

はとWHERE 1同じであることに注意してくださいWHERE 1=1。両方とも意味しますWHERE TRUEが、前者は実際にはブール値ではないとして多くのデータベース管理システムによって拒否されます。


16

私の主な用途は、クエリの開発中に簡単にコメントアウトできるようにすることです。私は鉛,のとandの:

SELECT
     A
--  ,B
    ,C
    ,D
--  ,E
FROM TABLE
WHERE 1=1
--  and B='This'
    and C='That'
--  and D is not null

また、プログラムを使って最後まで簡単にタックできるようにします。

this  = "SELECT * "
this += "FROM TABLE "
this += "WHERE 1=1 "
if user chooses option a then this += "and A is not null "
if user chooses option b then this += "and B is not null "
if user chooses option b then this += "and C is not null "
if user chooses option b then this += "and D is not null "

それ以外の場合は、最初のオプションを修飾し、次の各オプションで前のオプションを確認する必要があります。前の例でユーザーがオプションDのみを選択した場合はどうなりますか?else useをif A, B and C aren't chosen使用することを確認する必要がありWHEREますand。で=開始時に、あなただけの文の最後に修飾子を平手打ちすることができます。


1
そして、オブジェクト指向SQLジェネレーターのアイデアを思いついた人のために、オブジェクト指向のない言語で1980年のようなコードを書きましたか?
トムトム

私は書くcodeSSMSまたは類似のクエリツールの最初のブロックに似ています。データセットを調査し、適切な結果を取得してから、エンドユーザー向けのレポートツール(Crystal Reportsなど)に導入します。2番目のブロックは、私の仕事が生のsqlアクセスにあまり依存していないため、他の人が見ていることです。私は他の人々の同様のコードのトラブルシューティングを行い、その理由を理解できます。(コードはVB、C#およびPHPでした)。
WernerCD

10

なぜそうするのですか?

あまり有能でないプログラマーによって書かれた動的なコード生成が思い浮かびます。

SELECT .... WHEREを生成すると、SOMETHING ....が必要になるため、必要な場合にのみWHEREを追加する代わりに、何も存在しない場合に非制限条件を追加します。それを見た-「専門家」を発射する責任があります。

または、男は物事だけが必須です;)

私が見ることができない他のもの。


5

私は大企業の他の人々(1万人以上)が使用するPostgreSQL向けのC ++ / Cでユーザー定義関数をプログラミングしていました。私の関数にはオプションのwhereパラメーターがあります。値が指定されていない場合、句は使用されませんでした。これは明示的に文書化されました。残念ながら、この機能を使用している人はいませんし、where 1=1条項を提供するだけの人もいます。理論的にはこれは賢明ではないように見えますが、事実上すべてのクエリオプティマイザーはこれらのタイプのステートメントを除外します。そして、10,000人の人々を教育することは困難です。


3
誰もあなたのUDFに電話したことはありWHERE 1=1; DROP TABLE CUSTOMERSませんか?
きらめき

それでも、Where 1句を使用する背後にある概念を見つけることはできません。さらに説明が必要ですか?実行時間の改善が得られなかったため。
ursitesion

これは実行時間とはほとんど関係ありません。それは人々がどのようにプログラムするかという文化と関係があります。(IT担当者がプログラムした)コードがエンジニアによって使用されることもあります。これらの人はあなたのコードを考え、呼び出す独自の方法を持っています
アーサー

@Twinkles:これは間違いなく興味深い問題です。ここで注意すべき点がいくつかあります。(i)データベースはUDFに対して読み取り専用です(ii)私の関数はいくつかのテーブルグループをいくつかのグループで結合し、さらに悪いことにデータウェアハウジングウィンドウ関数を使用します。これにより、不可能ではありませんが、何かをドロップすることが困難になります。(iii)UDFはプリプロダクションコード用です。つまり、機能が本番環境に入らないことを意味します。機能が課題に耐える場合、別の部門がプログラミングしたすべてを完全に書き換えます
アーサー

4
実際、10,000人を教育するのは非常に簡単です。間違った場合にアプリケーションを失敗させます。彼らはすぐに間違ったことをやめます。
ジャスミン

2

「where 1 = 1」を使用すると、動的SQL 'where'句の生成に必要なコードの複雑さが軽減されます。そうでない場合、「where」句を作成するときに、これが追加された各コンポーネントの最初のコンポーネントであるかどうかを確認する必要があります。これは、コードの複雑さを軽減するためのシンプルなコードパターンであり、可能な場合はコードの複雑さを軽減することがほとんど常に正しい決定です。


0

プログラミングの観点から、1 = 1の1つの使用...ここに画像の説明を入力してください

このような状況で、実行時にクエリを作成する必要があり、それが短くても長くてもよい場合、「where 1 = 1 AND」を使用します

string criteria =string.Empty;
        if (txtc1.Text != "")
        {
            criteria += "criteria1=" + "'" + txtc1.Text + "' ";
        }
        if (txtc2.Text != "")
        {
            criteria += "OR criteria2=" + "'" + txtc2.Text + "' ";
        }
        if (ddl1.SelectedItem.Text != "")
        {
            criteria += "OR criteria3=" + "'" + ddl1.SelectedItem.Text + "' ";
        } if (ddl2.SelectedItem.Text != "")
        {
            criteria += "OR criteria4=" + "'" + ddl2.SelectedItem.Text + "' ";
        }
        if (ddl3.SelectedItem.Text != "")
        {
            criteria += "OR criteria5=" + "'" + ddl3.SelectedItem.Text + "' ";
        }
        if (ddl4.SelectedItem.Text != "")
        {
            criteria += "OR criteria6=" + "'" + ddl4.SelectedItem.Text + "' ";

        } 
        if (txtc1.Text == "")  
        {
            //criteria = criteria.Substring(2);
            criteria = criteria.Substring(2,criteria.Length-3);
        }
        if (criteria != string.Empty)
        {
            criteria = "where 1=1 AND " + criteria;
            //Response.Write("<script>alert('query constructed by you is : '+'" +criteria+ "');</script>");
            Response.Write(criteria);
        }

物事を簡単にする

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.