在Oracle中,正在启动SQL查询';带1=1的WHERE子句有用吗?

在Oracle中,正在启动SQL查询';带1=1的WHERE子句有用吗?,sql,oracle,Sql,Oracle,我正在使用一个客户机,该客户机在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.ac

我正在使用一个客户机,该客户机在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生成。基本上,每个条件都可以添加为
,而无需将第一个条件视为特殊条件(前面是
WHERE
而不是
),甚至不用担心是否应该有
WHERE
子句


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

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

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


我自己不会这样做。

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

where 1 = 1 and my_id = :b1;
(然后定义绑定变量的值)

一般来说,它比:

where 1 = 1 and my_id = 123456;

+1对于惰性,将PL/SQL简化一两行并将这种SQL应用于数据库是非常糟糕的。如果出于某种原因,他们需要设置cursor_sharing=FORCE,那就太糟糕了——不确定,但我认为CBO会面临“WHERE:1=:2和…”的问题,并相应地对其进行优化!有趣的是,我怀疑是这样的。这个客户端实际上也有这样的非动态查询。他们真的很懒:)@JeffreyKemp根据,DBMS使用这种模式不会对性能造成影响。@Danny我说的是Oracle。顺便说一句,OP也是如此。@JeffreyKemp“Oracle、MySQL和PostgreSQL也是如此”。