n00b 提问者在这里。我正在尝试执行查询以检查最近的事件是否在过去 24 小时内。从技术上讲,我可以获得我想要的结果,但我的案例陈述中的不平等必须在相反的方向上,这对我来说是有意义的。这是我的查询:
SELECT sqs.registration_id,
MAX(sqs.completed_at) AS 'most recent activity',
DATE_SUB(NOW(), INTERVAL 1 DAY) AS 'one day ago',
'recent activity?' = CASE
WHEN MAX(sqs.completed_at) <
DATE_SUB(NOW(), INTERVAL 1 DAY)
THEN 1
ELSE 0
END
FROM student_quiz_states sqs
WHERE sqs.score = 100
GROUP BY sqs.registration_id
这是一个示例结果:
XXXXX 2011-08-02 16:23:53 2011-12-05 00:06:05 0
该用户在过去 24 小时内没有事件,因此最后一个值返回 0,正如我所希望的那样。
但是,这对我来说没有任何意义。 case 语句不应该返回 1,因为第一个日期时间比一天前早得多吗?如果当我的 when_clause 包含 > 而不是 < 时返回我想要的结果,这对我来说是有意义的。
如有任何解释,我们将不胜感激。
最佳答案
问题是您的查询包含'recent activity?' = CASE ... END
它应该有 CASE ... END AS 'recent activity?'
。前者是相等性测试而不是带有别名的表达式。看似“反转”行为的原因是,由于 CASE
表达式是数字(它的计算结果为 0
或 1
),MySQL 执行一个数字相等测试,通过将 'recent activity?'
转换为 0.0 ( detailed rules here ),使得 'recent activity?' = CASE ... END
在 CASE
表达式给出 0
时为 true 而在它给出时为 false给出 1
。由于 MySQL 将 true 表示为 1
,将 false 表示为 0
,因此最终结果与您的预期相反.
(注意:此答案的早期版本,同时对相等性测试与别名以及关于 false 和 true 的相同基本点 0
和 1
,在其他方面含糊/混淆,因为我没有意识到 DBMS 是 MySQL,并且不知道某些 DBMS 允许在以下情况下使用单引号引用别名。因此,如果上面和下面的某些评论看起来有点奇怪,那是因为它们指的是那个版本。答案的当前状态在很大程度上要归功于这些评论。)
关于mysql - SQL case 语句中的不等号似乎向后工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8393735/