SQL case语句中的不等号签名似乎倒退了吗?

时间:2011-12-06 00:13:25

标签: 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包含一个&gt;时,如果返回了我想要的结果,那对我来说是有意义的。而不是&lt;。

任何解释都将不胜感激。

1 个答案:

答案 0 :(得分:4)

问题是,您的查询包含'recent activity?' = CASE ... END,其中应包含CASE ... END AS 'recent activity?'。前者是一个平等测试,而不是带别名的表达式。看似“反转”行为的原因是,由于CASE表达式是数字(它的计算结果为01),MySQL通过转换{来执行数字相等测试当'recent activity?'表达式给出'recent activity?' = CASE ... END false <时,{1}}到0.0(detailed rules here),CASE true / em>当它给出0时。由于MySQL将 true 表示为1而将 false 表示为1,因此最终结果与您的预期相反。

(注意:这个答案的早期版本,同时对等同测试与别名做出相同的基本观点,关于 false true 是{{1因为我没有意识到DBMS是MySQL,并且没有意识到某些DBMS在引用别名时允许使用单引号,所以和0在其他方面是模糊/混淆的。所以如果有的话上面和下面的评论看起来有点奇怪,这是因为他们指的是那个版本。答案的当前状态在很大程度上要归功于那些评论。)