MySQL中的“WHERE TRUE”有什么用

pkwftd7m  于 2023-10-15  发布在  Mysql
关注(0)|答案(4)|浏览(286)

我正在做我同事的旧项目,我在她的代码WHERE TRUE AND ID='1' AND STAT='1'上找到了。我尝试删除TRUE AND,这样查询就变成了WHERE ID='1' AND STAT='1',并得到相同的结果。
我知道我们可以使用TRUE作为布尔值来搜索“某个地方为真”,例如WHERE FLAG = TRUEthis MySQL documentation state that
常量TRUE和TRUE的值分别为1和0。常量名称可以用任何大小写书写。
我也试过SELECT * FROM MYTABLE WHERE TRUE,但它和SELECT * FROM MYTABLE一样。
TRUE在她的查询中的用途是什么?

yvfmudvl

yvfmudvl1#

它没有特定的功能目的。如果您的同事遵循一个特定的风格指南,建议所有SELECT查询都有显式的WHERE子句,那么他们可能已经包含了它。如果没有提供显式的WHERE子句,则默认选择所有行。添加一个始终为true的WHERE子句将具有相同的效果。
这个查询可能出现的另一种方式是,如果它是由代码生成工具生成的,由于它的编写方式,该工具总是必须写入WHERE子句。
例如:

myQuery = "SELECT X FROM Y WHERE " + ConditionMet(data)?" AccountID = '" + AcctId + "'" : "1=1";

这意味着如果ConditionMet(data)为true,则只返回AccountID与传入的AcctId匹配的行。如果为假,则返回所有行。
添加一个“dummy”1=1使代码生成器更容易编写。更一般地说,1=1和其他任何一个布尔子句一样是合法的,并且可以被“放入”到条件表达式中,而不必在查询中使用特殊情况来省略WHERE子句。
类似地,添加一个始终为false的WHERE子句(例如,“WHERE 1=0”)将导致返回零行。
请注意,这里的示例代码容易受到SQL注入的攻击,因此不应在处理不是您自己生成的AccountID的情况下使用它。有多种方法可以保护它,这些方法超出了本答案的范围。

gpnt7bae

gpnt7bae2#

如果你在运行时编写SQLString,你可能会添加不同的“where”子句,但你不知道它们中的哪一个是第一个,这使得它很容易,因为它们都可能以“AND .....”开头。
范例:

SQLString:='SELECT * FROM YOUTABLE WHERE TRUE'

If condition1 THEN SQLString:=SQLString+' AND Whatever=whatever';
If condition2 THEN SQLString:=SQLString+' AND Whatever=whatever';
If condition3 THEN SQLString:=SQLString+' AND Whatever=whatever';
If condition4 THEN SQLString:=SQLString+' AND Whatever=whatever';

否则,您不应该在第一个SQLString:=上添加WHERE子句,而应该在第一个恰好为真的条件上添加,您不知道它是否是先验的

hivapdat

hivapdat3#

它不是那么相关,但如果发现添加动态条件很重要,例如在PHP中。

$condition_stmt="";
    if ($start_date !="" && $end_date!="")
    {
        $condition_stmt="and nos.status_date between '".$start_date."' and '".$end_date."'";
    }
    else if ($start_date!="")
    {
        $condition_stmt="and nos.status_date >='".$start_date."'";
    }
    else 
    {
        $condition_stmt="and nos.status_date <='".$end_date."'";
    }

$sql=“select * from table where true“.$condition_stmt=.";

fruv7luv

fruv7luv4#

我的经验是,在测试查询时,它还通过方便注解掉行来帮助提高生产力。
例如在

SELECT *
FROM my_table
WHERE col1 = 'foo'
AND col2 = 'bar'

不可能轻易地消除col1 = 'foo'条件。
如果我们使用

SELECT *
FROM my_table
WHERE TRUE
AND col1 = 'foo'
AND col2 = 'bar'

AND col1 = 'foo'可以立即被注解掉,查询仍然有效。

相关问题