【问题标题】:unnecessary 1=1 in select query [duplicate]选择查询中不必要的 1=1 [重复]
【发布时间】:2020-12-21 00:36:03
【问题描述】:

以下查询用于我的一个产品中。我不明白为什么提到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;

【问题讨论】:

  • 但是,正如 Guy 所正确观察到的那样,现在从事这一天工作的人们可能已经受制于他们过去通过 以编程方式生成 SQL 语句所看到的内容。

标签: sql oracle where-clause


【解决方案1】:

where 1 = 1 始终为真,因此两个查询是等效的。大多数数据库能够在解析查询时识别出这一点,因此不会涉及性能损失。

应用程序使用这个虚拟的where 子句的一个常见原因是它可以很容易地在where 子句中进一步连接条件。

从字符串'where 1 = 1' 开始,应用程序可以根据需要连接尽可能多的and 谓词。否则,它需要检查是否已经在查询字符串中添加了条件,然后再决定是否需要在条件之前放置'and'

【讨论】:

    【解决方案2】:

    如果查询是动态生成的,如果有第一个1=1,那么添加where条件的逻辑会简单一些。 您可以像这样附加它们:

    STATIC QUERY
    AND WHERE_CONDITION_1
    AND WHERE_CONDITION_2
    AND WHERE_CONDITION_3
    ...
    

    而且它们不依赖于位置。

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

    【讨论】:

      【解决方案3】:

      就像我在上面评论的那样——今天的许多程序员完全习惯了“ORM”以及有时由它们生成的有时荒谬但语法正确的 SQL 子句。实际上:“没有伤害,没有犯规。”

      WHERE 1=1 当然是一个完全有效的WHERE 子句,如果你的内部逻辑(埋在有问题的 ORM 内部的某个地方......)的设计方式使得你 必须 产生一个。 ?‍♂️

      .. 或者,也许,如果您决定 您的编程 以某种方式需要join(' AND ') 一大堆子句,并且您决定需要在前面缝合一个“虚拟子句”他们。 (虽然,当然,你实际上没有。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-24
        • 1970-01-01
        • 1970-01-01
        • 2017-11-17
        • 2011-06-23
        • 1970-01-01
        • 1970-01-01
        • 2010-12-18
        相关资源
        最近更新 更多