我正在做我同事的旧项目,我在她的代码WHERE TRUE AND ID='1' AND STAT='1'
上找到了。我尝试删除TRUE AND
,这样查询就变成了WHERE ID='1' AND STAT='1'
,并得到相同的结果。
我知道我们可以使用TRUE
作为布尔值来搜索“某个地方为真”,例如WHERE FLAG = TRUE
和this MySQL documentation state that
常量TRUE和TRUE的值分别为1和0。常量名称可以用任何大小写书写。
我也试过SELECT * FROM MYTABLE WHERE TRUE
,但它和SELECT * FROM MYTABLE
一样。TRUE
在她的查询中的用途是什么?
4条答案
按热度按时间yvfmudvl1#
它没有特定的功能目的。如果您的同事遵循一个特定的风格指南,建议所有SELECT查询都有显式的WHERE子句,那么他们可能已经包含了它。如果没有提供显式的WHERE子句,则默认选择所有行。添加一个始终为true的WHERE子句将具有相同的效果。
这个查询可能出现的另一种方式是,如果它是由代码生成工具生成的,由于它的编写方式,该工具总是必须写入WHERE子句。
例如:
这意味着如果ConditionMet(data)为true,则只返回AccountID与传入的AcctId匹配的行。如果为假,则返回所有行。
添加一个“dummy”1=1使代码生成器更容易编写。更一般地说,
1=1
和其他任何一个布尔子句一样是合法的,并且可以被“放入”到条件表达式中,而不必在查询中使用特殊情况来省略WHERE
子句。类似地,添加一个始终为false的WHERE子句(例如,“WHERE 1=0”)将导致返回零行。
请注意,这里的示例代码容易受到SQL注入的攻击,因此不应在处理不是您自己生成的AccountID的情况下使用它。有多种方法可以保护它,这些方法超出了本答案的范围。
gpnt7bae2#
如果你在运行时编写SQLString,你可能会添加不同的“where”子句,但你不知道它们中的哪一个是第一个,这使得它很容易,因为它们都可能以“AND .....”开头。
范例:
否则,您不应该在第一个SQLString:=上添加WHERE子句,而应该在第一个恰好为真的条件上添加,您不知道它是否是先验的
hivapdat3#
它不是那么相关,但如果发现添加动态条件很重要,例如在PHP中。
$sql=“select * from table where true“.$condition_stmt=.";
fruv7luv4#
我的经验是,在测试查询时,它还通过方便注解掉行来帮助提高生产力。
例如在
不可能轻易地消除
col1 = 'foo'
条件。如果我们使用
AND col1 = 'foo'
可以立即被注解掉,查询仍然有效。