web-dev-qa-db-ja.com

なぜWHERE 1またはWHERE 1 = 1を使用するのですか?

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

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

基本的にはAND...を使用して追加の条件を追加でき、実行時間に影響を与えないため、プログラマーの便宜のためだけです。

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

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

47
Twinkles

私の主な用途は、クエリの開発中に、コメントアウトしやすくすることです。私は,and 's:

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のみを選択した場合はどうなりますか?あなたはそれを確認する必要がありますif A, B and C aren't chosenの場合はWHEREを使用し、それ以外の場合はandを使用します。 =最初に、修飾子をステートメントの最後までたたくことができます。

19
WernerCD

なぜそうするのですか?

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

SELECT .... WHEREを生成し、SOMETHING ....が必要になるため、必要な場合にのみWHEREを追加するのではなく、そこに何もない場合に非制限条件を追加します。それを見た-「専門家」を解雇する責任があります。

または、男だけがどこにあるかが必須です;)

それ以外は見逃しています。

10
TomTom

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

5
arthur

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

3
Niall

DataGripやIntellijのデータベースプラグインなどの一部のツールは、updateまたはdeleteクエリにwhere句がない場合、安全でないクエリ警告で実行を停止します。これは手動で無効にすることができますが、コンソールで作業して警告を受けたいがそのようなスクリプトを頻繁に実行する場合は、常にtrueに解決されるものを追加するのが最も簡単なオプションのようです。

0
Andronicus

プログラミングの観点から、1 = 1の1つの使用法... enter image description here

このような状況で、実行時にクエリを作成する必要があり、それが短い場合も長い場合もある場合、「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);
        }

物事を簡単にする

0
Saurabh