可能な重複:
SQLクエリに「where 1 = 1」がある理由
SQL句でWHERE 1 = 1 AND <条件>を使用するのはなぜですか?
これはさまざまなクエリの例で多く見られ、おそらくすべてのSQLエンジンに当てはまります。
条件が定義されていないクエリがある場合、人々(および特にORMフレームワーク)は、常に真の条件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` = '[email protected]'
LIMIT 1;
その余分な条件を追加する理由はありますか?
ええ、それは通常、ステートメントを強制的に失敗させるために「where 1 = 0」として始まるためです。
これは、クエリをテストするために、トランザクションで最後にコミットせずにトランザクションをラップするより単純な方法です。 (これは推奨される方法です)。
これは、人々がSQLクエリをプログラムで構築するの場合の一般的な慣例でもあります。'where1 = 1 'から始めて、顧客IDに応じて' and customer.id =:custId 'を追加する方が簡単です。供給される。したがって、「and ...」で始まるクエリの次の部分をいつでも追加できます。
1 = 1は常にすべてのrdbmsによって無視されます。WHERE 1 = 1でクエリを実行するトレードオフはありません。
ORMフレームワークなどの動的なWHERE条件の作成は非常に頻繁に行われますが、 real 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());
}
動的SQLクエリを作成するときは本質的に面倒なので、人々はそれを使用します。 "where 1 = 1"
で始まる場合、余分な句はすべて"and"
で始まるだけなので、理解する必要はありません。
本質的に怠惰であることに何か問題があるというわけではありません。 「空の」リストが2つのセンチネルノードで構成され、first->next
からlast->prev
までの処理を開始する二重リンクリストを見ました。
これにより、first
およびlast
ノードを削除するための特別な処理コードがすべて削除されました。この設定では、first
またはlast
を削除できなかったため、everyノードは中間ノードでした。 2つのノードが無駄になりましたが、コードはより単純で(少しでも)高速でした。
私が「1 = 1」構成を見たことがある他の唯一の場所は、BIRT内です。レポートは位置パラメータを使用することが多く、すべての値を許可するようにJavaScriptで変更されます。したがって、クエリ:
select * from tbl where col = ?
ユーザーが"*"
を選択すると、col
に使用されているパラメーターが次のように変更されます。
select * from tbl where ((col = ?) or (1 = 1))
これにより、位置パラメータの詳細をいじることなく、新しいクエリを使用できます。そのようなパラメーターはまだ1つだけあります。適切なDBMS(DB2/zなど)は、クエリを最適化して基本的に句を完全に削除してから実行プランを構築しようとするため、トレードオフはありません。
1 = 1を使用することは、それ自体がテーブル全体のスキャンを引き起こす可能性があるため、実際にはあまり良い考えではありません。
これを参照してください-> T-SQL 1 = 1パフォーマンスヒット
あなたが言ったように:
条件を動的に追加する場合は、最初の文字を取り除くことを心配する必要はありません。それが唯一の理由である可能性がありますが、それは正しいです。