我正在处理我同事的旧项目,我在她的代码中找到了 WHERE TRUE AND ID='1' AND STAT='1'
。
我试图删除 TRUE AND
,因此查询变为 WHERE ID='1' AND STAT='1'
并获得相同的结果。
我知道我们可以使用 TRUE
作为 bool 值来搜索“哪里是真的”,例如 WHERE FLAG = TRUE
和 this MySQL documentation state that
The constants TRUE and FALSE evaluate to 1 and 0, respectively. The constant names can be written in any lettercase.
我也试过 SELECT * FROM MYTABLE WHERE TRUE
但它和 SELECT * FROM MYTABLE
一样
她的查询中 TRUE
的目的是什么?
最佳答案
它没有特定的功能目的。如果您的同事遵守建议所有 SELECT 查询都具有显式 WHERE 子句的特定样式指南,则他们可能已经包含了它。如果未提供显式 WHERE 子句,则默认选择所有行。添加始终为真的 WHERE 子句将具有相同的效果。
另一种可能出现此查询的方式是,如果它是由代码生成工具生成的,由于其编写方式,该工具始终必须写入 WHERE 子句。
例如:
myQuery = "SELECT X FROM Y WHERE " + ConditionMet(data)?" AccountID = '" + AcctId + "'" : "1=1";
这意味着如果 ConditionMet(data) 为真,则仅返回 AccountID 与您传入的 AcctId 匹配的行。如果为假,则返回所有行。
添加“虚拟”1=1 使代码生成器更易于编写。更一般地说,1=1
与任何其他 bool 子句一样是合法的 bool 子句,并且可以“放入”条件表达式中,而不必特殊情况下查询以省略 WHERE
子句。
同样,添加始终为假的 WHERE 子句(例如“WHERE 1=0”)将导致返回零行。
请注意,此处的示例代码易受 SQL 注入(inject)攻击,因此不应在您处理并非您自己生成的 AccountID 的情况下使用。有多种方法可以保护它,超出了本答案的范围。
关于mysql - 'WHERE TRUE'在MySQL中有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37849028/