mysql - 'WHERE TRUE'在MySQL中有什么用

标签 mysql

我正在处理我同事的旧项目,我在她的代码中找到了 WHERE TRUE AND ID='1' AND STAT='1'。 我试图删除 TRUE AND,因此查询变为 WHERE ID='1' AND STAT='1' 并获得相同的结果。

我知道我们可以使用 TRUE 作为 bool 值来搜索“哪里是真的”,例如 WHERE FLAG = TRUEthis 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/

相关文章:

php - 在php中的一个查询中定义变量并运行查询

MySQL数据透视查询

c# - Mysql 连接器 - MultipleActiveResultSets 问题

Python "int64"无法转换为 MySQL 类型

mysql - 我们如何在 zend 框架中使用 IN() 编写查询?

MySQL Server 5.7 无法启动且未填充错误日志

php - 从 BLOB 中删除信息

mysql - JOIN 多个表,结果在同一列上

php - 使用php在mysql中插入拉丁字符?

mysql - 包含多个 'Not Like' 的 Where 语句