43

重複の可能性:
SQL クエリに「where 1 = 1」があるの
はなぜですか? SQL 句で WHERE 1=1 AND <条件> を使用するのはなぜですか?

さまざまなクエリの例でそれをたくさん見てきましたが、おそらくすべての SQL エンジンに当てはまります。

条件が定義されていないクエリがある場合、人々 (および特に ORM フレームワーク) は、常に true 条件WHERE 1 = 1またはそのようなものを追加することがよくあります。

だから代わりに

SELECT id, name FROM users;

彼らは使う

SELECT id, name FROM users WHERE 1 = 1;

条件を動的に追加する場合に考えられる唯一の理由は、最初の条件を削除することを心配する必要はありませんが、クエリに実際の条件がある場合、この条件が削除さANDれることがよくあります。1 = 1

CakePHP の実際の例 (フレームワークによって生成):

(条件なし)

SELECT `User`.`id`, `User`.`login`
FROM `users` AS `User` WHERE 1 = 1 
ORDER BY `User`.`id` ASC;

(条件付き)

SELECT `User`.`id`, `User`.`login`
FROM `users` AS `User` 
WHERE `User`.`login` = 'me@example.com'
LIMIT 1;

その余分な条件を追加する理由はありますか?

4

6 に答える 6

40

また、SQL クエリをプログラムで作成する場合の一般的な方法でもあります。顧客 ID が提供されているかどうかに応じて、'where 1=1' から始めて、' and customer.id=:custId' を追加する方が簡単です。したがって、「and ...」で始まるクエリの次の部分をいつでも追加できます。

于 2009-08-12T07:23:35.493 に答える
28

1 = 1は、常にすべてのrdbmsによって無視されます。WHERE 1=1でクエリを実行することによるトレードオフはありません。

ORMフレームワークなどの動的なWHERE条件を構築することは非常に頻繁に行われ、現在の条件の前にANDを追加するチェックを回避するため、実際のwhere条件を追加する方が簡単です。

stmt += "WHERE 1=1";
if (v != null) {
   stmt += (" AND col = " + v.ToString());
}

これは、1=1がない場合の外観です。

var firstCondition = true;
...
if (v != null) {
   if (!firstCondition) {
      stmt += " AND ";
   }
   else {
       stmt += " WHERE ";
       firstCondition = false;
   }
   stmt += "col = " + v.ToString());
}
于 2009-08-12T07:37:20.660 に答える
21

動的 SQL クエリを作成するときに本質的に怠惰であるため、人々はそれを使用します。a で始めると、"where 1 = 1"余分な句はすべて で始まるだけで"and"、理解する必要はありません。

本質的に怠け者であることは悪いことではありません。「空の」リストが2つのセンチネルノードで構成され、包括的にfirst->nextなるまで処理を開始する、二重にリンクされたリストを見てきました。last->prev

firstこれにより、ノードとノードを削除するための特別な処理コードがすべて削除されましたlast。この設定では、またはを削除できなかったため、すべてのノードが中間ノードでした。2 つのノードが無駄になりましたが、コードはよりシンプルになり、(わずかに) 高速になりました。firstlast

"1 = 1" の構文を目にしたことがあるのは、BIRT だけです。レポートは多くの場合、位置パラメーターを使用し、Javascript で変更してすべての値を許可します。したがって、クエリは次のとおりです。

select * from tbl where col = ?

"*"ユーザーが使用されているパラメーターを選択すると、次のcolように変更されます。

select * from tbl where ((col = ?) or (1 = 1))

これにより、位置パラメータの詳細をいじることなく、新しいクエリを使用できます。そのようなパラメーターはまだ 1 つだけあります。適切な DBMS (DB2/z など) は、クエリを最適化して、基本的に実行計画を作成する前に句を完全に削除するため、トレードオフはありません。

于 2009-08-12T07:52:53.000 に答える
13

ええ、それは通常、ステートメントを強制的に失敗させるために、「where 1 = 0」として開始するためです。

クエリをテストするために、トランザクションにラップし、最後にコミットしないという単純な方法です。(これが推奨される方法です)。

于 2009-08-12T07:21:01.397 に答える
1

あなたが言ったように:

条件を動的に追加している場合は、最初の AND を削除することを心配する必要はありません。それが唯一の理由です。そのとおりです。

于 2009-08-12T07:27:42.523 に答える
-1

1=1 を使用すると、それ自体で完全なテーブル スキャンが発生する可能性があるため、実際にはあまり良い考えではありません。

これを参照してください-> T-SQL 1=1 パフォーマンス ヒット

于 2009-08-12T07:21:42.393 に答える