mysql - SQL case 语句中的不等号似乎向后工作?

标签 mysql sql case equality

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 表达式是数字(它的计算结果为 01),MySQL 执行一个数字相等测试,通过将 'recent activity?' 转换为 0.0 ( detailed rules here ),使得 'recent activity?' = CASE ... ENDCASE 表达式给出 0 时为 true 而在它给出时为 false给出 1。由于 MySQL 将 true 表示为 1,将 false 表示为 0,因此最终结果与您的预期相反.

(注意:此答案的早期版本,同时对相等性测试与别名以及关于 falsetrue 的相同基本点 01,在其他方面含糊/混淆,因为我没有意识到 DBMS 是 MySQL,并且不知道某些 DBMS 允许在以下情况下使用单引号引用别名。因此,如果上面和下面的某些评论看起来有点奇怪,那是因为它们指的是那个版本。答案的当前状态在很大程度上要归功于这些评论。)

关于mysql - SQL case 语句中的不等号似乎向后工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8393735/

相关文章:

php - PHP和MySQL-mysqli_free_result()期望参数1为mysqli_result,在第110行给出的 bool 值

mysql - 添加外键时如何知道引用表的删除 Action

mysql - 如果未找到单行,则返回默认值

sql - 组合 Active Record 组、连接、最大值和最小值

mysql - 在带有 LIKE 的 CASE 语句中使用 GROUP_CONCAT 列别名

mysql - 将 Mysql CASE select 语句结果存储在一个变量中

mysql - 今天是在两个 (DATETIME) 列之间吗? (空或全零算作不受限制的上限/下限)

sql - 在 java 准备好的语句调用上获取 "invalid create index error"但相同的语句在 SQL Developer 中有效

mysql - 如何有效地从一个巨大的表中随机获取一行?

sql - 如何跳过sql中的case语句?