任何人都可以帮助我理解或发布有关此where子句的任何想法吗?
sql was here
我已经更改了表名,但除此之外,还知道开发人员在这里尝试做什么吗?
之后没有别的,那就是where子句。
答案 0 :(得分:1)
如果(table.date_field = (select max(table2.exit_date) from table as table2))
为空,它将返回1=1
,这基本上意味着根本没有where子句。
现在让我们看看那个讨厌的表情。我只能假设如果“a = b”不为真,那么它也等于null,否则看起来第一个分支总会发生。看起来它试图说“如果最新的退出日期等于日期字段,请选择那些,否则没有where子句”。但是,我认为这根本不会起作用。它看起来真的是两种方式,每一行都会被选中。
答案 1 :(得分:1)
MySQL ifnull
函数返回第一个参数,如果它不为null,否则返回第二个参数。这看起来像是尝试将table.date_field与max(table2.exit_date)进行比较,如果由于空值而无法进行同步,则返回true。
答案 2 :(得分:1)
在我看来,他正试图找到table.date_field
等于table.exit_data
的最大值的行。我认为在任何这些情况下都会检查null:
table
为空table
中的所有行都将exit_data
设置为NULL
table.date_field
对于有问题的行<{1}} 在这三种情况中的任何一种情况下,都会返回该行。我不明白为什么他使用字符串NULL
代替,给出一些例子:'1=1'
,1=1
或1
,但似乎工作正常。在第一种情况下,我假设结果集中没有行(取决于查询的其余部分),所以他可能正在尝试处理其他两种情况中的一种 - 我猜最后一种情况。
这只是对正在发生的事情的解释。为了理解为什么他正在做这件事,如果你提供更多的背景知识会有所帮助。
答案 3 :(得分:1)
MySQL是非标准的,因为 true 实际上等于数值1.任何计算结果为 true 或任何非零值的表达式都满足条件。
mysql> CREATE TABLE foo AS SELECT 1=1 AS f;
mysql> SHOW CREATE TABLE foo;
CREATE TABLE `foo` (
`f` INT NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1
因此,以下WHERE子句在MySQL中是合法的,但在大多数其他SQL数据库中是不合法的:
... WHERE 1;
有些人使用1=1
作为占位符条件,意味着 true ,但是将它放在字符串中是没有意义的,因为SQL表达式不等同于eval()
函数和其他语言一样。在这种情况下,字符串中的前导字符1被隐式转换为数值1,在MySQL中被解释为 true 。所以它可能按预期工作,但有点意外。
使用IFNULL()
是因为如果date_field
或MAX(exit_date)
为NULL,则返回该行。如果你没有使用这个函数,那么任何 = NULL将被评估为 unknown ,这意味着不会返回该行。
答案 4 :(得分:0)
它基本上表示如果table.date_field =最大退出日期或者如果max exit_date为null或table.date_field为null则返回true。如果max exit_date不为null且table.date_field不为null但它们不相等,则返回false。