292

なぜ誰かがWHERE 1=1 AND <conditions>SQL句で使用するのでしょうか(連結された文字列を介して取得されたSQL、またはビュー定義のいずれか)

これが SQL インジェクションから保護するために使用されることをどこかで見たことがありますが、非常に奇妙に思えます。

注入WHERE 1 = 1 AND injected OR 1=1がある場合は、 と同じ結果になりinjected OR 1=1ます。

後で編集: ビュー定義での使用法はどうですか?


回答ありがとうございます。

それでも、誰かがビューを定義するためにこの構造を使用したり、ストアド プロシージャ内で使用したりする理由がわかりません。

たとえば、次のようにします。

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value
4

21 に答える 21

381

条件のリストがコンパイル時に不明であり、代わりに実行時に構築される場合は、条件が 1 つなのか複数なのかを気にする必要はありません。次のようにすべて生成できます。

and <condition>

それらをすべて連結します。最初の1=1で、イニシャルandには関連付けるものがあります。

あなたが言うように、これが注射保護に使用されているのを見たことがありません. 実装の利便性として使用されているのを見てきましたSQL クエリ エンジンは最終的に を無視する1=1ため、パフォーマンスへの影響はありません。

于 2008-10-28T10:39:59.423 に答える
123

グレッグの答えにサンプルコードを追加するだけです。

dim sqlstmt as new StringBuilder
sqlstmt.add("SELECT * FROM Products")
sqlstmt.add(" WHERE 1=1") 

''// From now on you don't have to worry if you must 
''// append AND or WHERE because you know the WHERE is there
If ProductCategoryID <> 0 then
  sqlstmt.AppendFormat(" AND ProductCategoryID = {0}", trim(ProductCategoryID))
end if
If MinimunPrice > 0 then
  sqlstmt.AppendFormat(" AND Price >= {0}", trim(MinimunPrice))
end if
于 2008-10-28T10:53:21.270 に答える
39

条件の数が可変である場合に使用されるのを見てきました。

「AND」文字列を使用して条件を連結できます。次に、渡す条件の数を数える代わりに、ストック SQL ステートメントの最後に「WHERE 1=1」を配置し、連結された条件をスローします。

基本的に、条件のテストを行い、条件の前に「WHERE」文字列を追加する必要がなくなります。

于 2008-10-28T10:43:05.503 に答える
28

WHERE 句が既に定義されていることを常に認識し、それが最初のものであるかどうかを確認することなく条件を追加し続けることを可能にする怠惰な方法のようです。

于 2008-10-28T10:40:05.493 に答える
22

間接的に関連: 1=2 が使用される場合:

CREATE TABLE New_table_name 
as 
select * 
FROM Old_table_name 
WHERE 1 = 2;

これにより、古いテーブルと同じスキーマを持つ新しいテーブルが作成されます。(比較のためにいくつかのデータをロードしたい場合に非常に便利です)

于 2013-02-20T14:37:24.097 に答える
17

1 = 1 式は、生成された SQL コードで一般的に使用されます。この式は、SQL 生成コードを簡素化し、条件文の数を減らすことができます。

于 2008-10-28T10:40:46.833 に答える
12

実際、BIRT レポートでこの種のものが使用されているのを見たことがあります。BIRT ランタイムに渡されるクエリの形式は次のとおりです。

select a,b,c from t where a = ?

そしてその '?' 実行時に、ドロップダウン ボックスから選択された実際のパラメータ値に置き換えられます。ドロップダウンの選択肢は次のとおりです。

select distinct a from t
union all
select '*' from sysibm.sysdummy1

すべての可能な値と " *" を取得します。ユーザーが*ドロップダウン ボックスから " " を選択した場合 (a のすべての値を選択する必要があることを意味します)、クエリを実行する前に (Javascript で) 変更する必要があります。

「?」以来 は位置パラメータであり、他のことが機能するためにそこにとどまる必要があります。Javascript はクエリを次のように変更します。

select a,b,c from t where ((a = ?) or (1==1))

これにより、基本的に where 句の影響がなくなりますが、位置パラメータはそのまま残ります。

SQL クエリを動的に作成する際に、レイジー コーダーが使用する AND ケースも見てきました。

andで始まるクエリを動的に作成する必要があるとselect * from tします。

  • 名前はボブです。と
  • 給料は2万ドル以上

最初に WHERE を追加し、その後に AND を追加する人もいます。

select * from t where name = 'Bob' and salary > 20000

怠惰なプログラマー (それは必ずしも悪い特徴ではありません) は、追加された条件を区別せず、最初からselect * from t where 1=1AND 句を追加し、その後に追加します。

select * from t where 1=1 and name = 'Bob' and salary > 20000
于 2008-10-28T12:13:03.183 に答える
6

密接に関連する例を次に示します。MERGEたとえば、結合する共通の属性がないソース テーブルのすべての値を使用して、SQL ステートメントを使用してターゲット テーブルを更新します。

MERGE INTO Circles
   USING 
      (
        SELECT pi
         FROM Constants
      ) AS SourceTable
   ON 1 = 1
WHEN MATCHED THEN 
  UPDATE
     SET circumference = 2 * SourceTable.pi * radius;
于 2011-11-17T09:33:42.587 に答える
6

1=1 が生成された SQL に役立つことはわかりますが、私が PHP で使用する手法は、句の配列を作成してから実行することです。

implode (" AND ", $clauses);

したがって、先頭または末尾の AND の問題を回避できます。明らかに、これは、少なくとも 1 つの句があることがわかっている場合にのみ役立ちます。

于 2010-01-07T16:00:12.790 に答える
5

を検索してここに来た場合は、とが同一であるWHERE 1ことに注意してください。一部のデータベースシステムは、実際にはブール値ではないと見なして拒否するため、めったに使用されません。WHERE 1WHERE 1=1WHERE 1WHERE 1

于 2016-04-05T13:06:56.470 に答える
1

これは通常、ユーザーが選択できる多くのドロップダウン値を持つレポート用に動的 SQL を作成するときに行います。ユーザーは各ドロップダウンから値を選択する場合と選択しない場合があるため、どの条件が最初の where 句であるかを判断するのに苦労します。そのため、クエリwhere 1=1の最後に a を追加し、その後にすべての where 句を追加します。

何かのようなもの

select column1, column2 from my table where 1=1 {name} {age};

次に、このように where 句を作成し、パラメーター値として渡します。

string name_whereClause= ddlName.SelectedIndex > 0 ? "AND name ='"+ ddlName.SelectedValue+ "'" : "";

where 句の選択は実行時に不明であるため、これは、'AND' or 'WHERE'.

于 2014-03-19T05:43:36.750 に答える
0

述語 like の使用1=1は、アクセス プランにインデックス スキャンの使用または使用を強制するために時々使用される通常のヒントです。これが使用される理由は、where 句に多くの述語を含む複数のネストされた結合クエリを使用している場合で、すべてのインデックスを使用してもアクセス プランが各テーブルを読み取る場合があるためです (フル テーブル スキャン)。これは、DBA がより効率的なパスを使用するように dbms をだますために使用する多くのヒントの 1 つにすぎません。投げ込まないでください。クエリは常に機能するとは限らないため、クエリを分析するにはデータベース管理者が必要です。

于 2012-08-10T15:50:14.400 に答える
0

私が最初にこれに出くわしたのは、ADO と従来の ASP でした。私が得た答えは、「パフォーマンス」でした。 ストレートをすると

Select * from tablename

それをSQLコマンド/テキストとして渡すと、パフォーマンスが大幅に向上します

Where 1=1

加えて、それは目に見える違いでした。最初の条件が満たされるとすぐに返されるテーブル ヘッダーに関係するもの、またはその他の狂気のようなものですが、いずれにせよ、処理速度が向上しました。

于 2009-02-05T18:44:14.893 に答える