我正在研究我同事的旧项目,我找到了她的代码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和FALSE分别计算为1和0。常量名称可以用任何字母组写。
我也尝试了SELECT * FROM MYTABLE WHERE TRUE
,但它与SELECT * FROM MYTABLE
TRUE
在她的查询中的目的是什么?
答案 0 :(得分:2)
它没有特定的功能目的。如果您的同事遵守特定的样式指南,建议所有SELECT查询都有明确的WHERE子句,那么您的同事可能已将其包括在内。如果未提供显式WHERE子句,则默认为选择所有行。添加始终为true的WHERE子句将产生相同的效果。
此查询可能产生的另一种方式是,它是否由代码生成工具生成,由于编写方式,它总是必须写入WHERE子句。
例如:
myQuery = "SELECT X FROM Y WHERE " + ConditionMet(data)?" AccountID = '" + AcctId + "'" : "1=1";
这意味着如果ConditionMet(data)为true,则只返回AccountID与您传入的AcctId匹配的行。如果为false,则返回所有行。
添加“dummy”1 = 1使代码生成器更易于编写。
同样,添加一个始终为false的WHERE子句(例如“WHERE 1 = 0”)将导致返回零行。
答案 1 :(得分:1)
它不是很重要,但是在添加动态条件的地方(例如在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 =。“;
答案 2 :(得分:0)
如果您是在运行时编写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子句,而是在碰巧为真的第一个条件上添加WHERE子句,您不知道这将是先验的