Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择查询中不必要的1=1_Sql_Oracle_Where Clause - Fatal编程技术网

Sql 选择查询中不必要的1=1

Sql 选择查询中不必要的1=1,sql,oracle,where-clause,Sql,Oracle,Where Clause,下面的查询用于我的一个产品。我不理解为什么提到1=1。它总是会成为现实 select * from emp; select * from emp where 1=1; 据我了解,两者都是一样的。开发人员在下面的查询中输入1=1的意图是什么?他可以简单地将where条件写在and条件之一中 SELECT msi.concatenated_segments item_code, mmt.transaction_date, mtt.transaction_type_name, mmt.trans

下面的查询用于我的一个产品。我不理解为什么提到1=1。它总是会成为现实

select * from emp;
select * from emp where 1=1;
据我了解,两者都是一样的。开发人员在下面的查询中输入1=1的意图是什么?他可以简单地将where条件写在and条件之一中

SELECT   msi.concatenated_segments item_code,
mmt.transaction_date,
mtt.transaction_type_name,
mmt.transaction_quantity,
mcd.prior_cost,
mcd.new_cost
   FROM 
mtl_cst_actual_cost_details mcd,
mtl_system_items_kfv msi,
mtl_material_transactions mmt,
mtl_COST_types mtt
WHERE 1 = 1  -------------------------------------------------This I am refering
AND mcd.inventory_item_id = msi.inventory_item_id
AND mcd.organization_id = msi.organization_id
AND mcd.transaction_id = mmt.transaction_id
AND mmt.inventory_item_id = msi.inventory_item_id
AND mmt.organization_id = msi.organization_id
AND mmt.transaction_type_id = mtt.transaction_type_id
ORDER BY mcd.creation_date DESC;
其中1=1始终为真,因此两个查询都是等价的。大多数数据库在解析查询时都能够识别这一点,因此不涉及性能损失

应用程序使用此虚拟where子句的一个常见原因是,它可以方便地在where子句中进一步连接条件


从字符串“where 1=1”开始,应用程序可以根据需要连接任意多个和谓词。否则,在决定是否有必要在条件前加上“and”之前,它需要检查查询字符串中是否已经添加了条件。

如果查询是动态生成的,那么如果有第一个1=1,则添加where条件的逻辑会简单一些。
SELECT   msi.concatenated_segments item_code,
mmt.transaction_date,
mtt.transaction_type_name,
mmt.transaction_quantity,
mcd.prior_cost,
mcd.new_cost
   FROM 
mtl_cst_actual_cost_details mcd,
mtl_system_items_kfv msi,
mtl_material_transactions mmt,
mtl_COST_types mtt
WHERE 1 = 1  -------------------------------------------------This I am refering
AND mcd.inventory_item_id = msi.inventory_item_id
AND mcd.organization_id = msi.organization_id
AND mcd.transaction_id = mmt.transaction_id
AND mmt.inventory_item_id = msi.inventory_item_id
AND mmt.organization_id = msi.organization_id
AND mmt.transaction_type_id = mtt.transaction_type_id
ORDER BY mcd.creation_date DESC;
您可以像这样附加它们:

STATIC QUERY
AND WHERE_CONDITION_1
AND WHERE_CONDITION_2
AND WHERE_CONDITION_3
...
它们并不取决于位置


我认为一些ORM系统也使用这种方法。

就像我在上面评论的那样–今天的许多程序员完全习惯于ORM,以及有时由它们生成的有时毫无意义但语法正确的SQL子句。事实上:没有伤害,没有犯规


其中1=1当然是一个完全有效的WHERE子句,如果您的内部逻辑埋在所讨论的ORM的内部某处。。。是这样设计的,你必须生产一个。但是——正如盖伊正确地观察到的那样——今天这样做的人可能已经习惯于他们过去通过编程生成的SQL语句所看到的情况。