如果CASE语句中的参数满足多个WHEN(无论查询顺序如何),则始终满足条件的第一个THEN总是被传递,其余的比较被忽略吗?换句话说,结构中的每个其他WHEN子句是否等效于ELSEIF三元数? 是否有例外情况取决于随机结果顺序?
CREATE TABLE test (non_unique_id INT(11) UNSIGNED, a BOOL, b BOOL);
INSERT INTO test VALUES(1,0,1),(1,1,0),(2,0,1);
SELECT non_unique_id,
CASE
WHEN MAX(a=1) THEN 'a'
WHEN MAX(b=1) THEN 'b'
END AS ttype
FROM test GROUP BY non_unique_id;
返回
non_unique_id ttype
1 a
2 b
这是预期的结果。我的问题是,在这种情况下,是否可以有效地将CASE / WHEN用作在可靠分组之前对子查询进行排序的一种方式。
答案 0 :(得分:1)
尚不清楚您要问什么,但我觉得您担心MAX
函数可能会遇到例如a=1
,然后报告'a'
,之前检查该列的其余部分,以查看某处是否有a=2
。
据我所知,SQL 必须中的聚合函数检查每个组(或整个表(如果未使用GROUP BY
的话)的所有记录。如果数据库可以使用索引,则不需要检查所有记录,这可能是一个例外。但是,即使在使用索引的情况下,数据库也只能避免可以确定没有必要检查所有记录。