【问题标题】:In Oracle, is starting the SQL Query's WHERE clause with 1=1 useful?在 Oracle 中,以 1=1 开始 SQL 查询的 WHERE 子句有用吗?
【发布时间】:2017-12-20 13:45:16
【问题描述】:

我正在与一个客户合作,该客户在 Oracle 中几乎所有的 WHERE 子句都以 1=1 开头。原谅我的无知,但这不是无操作吗?这种用法有什么负面影响吗?

这是一个经过清理的示例:

SELECT   gpz.zname
         ,gpp.pname
FROM     table1 gpp INNER JOIN table2 gpz ON gpz.p_id = gpp.p_id
WHERE    1=1
         AND gpp.active = 1
         AND gpz.active = 1

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    这样做是为了简化动态 SQL 生成。基本上每个条件都可以添加为AND <condition>,而无需将第一个条件视为特殊条件(它前面是WHERE 而不是AND),甚至担心是否应该有WHERE 子句。

    因此,只需将其记为易于使用,或者可以说是懒惰。

    【讨论】:

    • +1 表示懒惰,将 PL/SQL 简化一两行并在数据库上施加这种 SQL 非常糟糕。如果由于某种原因他们需要设置 cursor_sharing=FORCE,那就太糟糕了 - 不确定,但我认为 CBO 将面临“WHERE :1 = :2 AND ...”并相应地对其进行优化!有趣的发现......
    • 我怀疑是这种情况。这个客户端实际上也有这样的非动态查询。他们真的很懒:)
    • @JeffreyKemp 根据T-SQL 1=1 Performance Hit,使用这种模式不会影响 DBMS 的性能。
    • @Danny 我说的是甲骨文。顺便说一句,OP 也是。
    • @JeffreyKemp “Oracle、MySQL 和 PostgreSQL 也是如此”。
    【解决方案2】:

    如果他们动态构建查询,您应该检查他们是否使用绑定变量。从文字构建查询需要额外的解析,可能会限制可伸缩性,并且还会大大增加 SQL 注入攻击的风险。

    where 1 = 1 and my_id = :b1;
    

    (然后定义绑定变量的值)

    通常比:

    where 1 = 1 and my_id = 123456;
    

    【讨论】:

      【解决方案3】:

      他们可能已经从子字符串中构建了查询。

      这可能是一种仅使用ANDs 构建它的方法,具体取决于业务规则匹配,因此您不必真正关心哪个是您的第一个条件。

      我自己不会那样做的。

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        • 2023-03-13
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多