mysql - 分组案例/何时优先级始终是最后一个案例?
问题描述
如果您在 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 是否可以有效地用作在分组之前可靠地订购子查询的一种方式。
解决方案
尚不完全清楚您要问什么,但我感觉到您担心该MAX
函数可能会遇到 eg a=1
,然后 report 'a'
,然后再检查列的其余部分以查看是否有a=2
某个地方。
据我所知,SQL 中的聚合函数必须检查每个组的所有记录(或整个表,如果GROUP BY
未使用)。例外情况可能是数据库可以使用索引,这样就不需要检查所有记录。但即使在索引的情况下,数据库也只会在可以确定没有必要检查所有记录的情况下避免检查所有记录。
推荐阅读
- python - 使用 python 验证 mp3 文件的最佳方法
- r - 将所有列与一列匹配的条件
- umbraco - 将 IContent 转换为 IPublishedContent Umbraco 8
- java - 使用 WS-Security 签署 SOAP 消息
- ios - Xcode 10.2.1:跳转到运算符定义?
- r - 使用 Sparklyr 将 NA 替换为 LOCF
- asp.net-core - 如何在不停止/启动服务的情况下在 Linux 机器上部署 dotnet 核心代码?
- java - 在 netbeans 中部署 javafx 应用程序时出现问题
- scala - 使用 ReactiveMongo 计算查询的文档结果数(播放 2.7 和 scala 2.12)
- c# - 从另一个窗口的 UserControl WPF 将 ListBoxItem 添加到窗口的 UserControl 中的 ListBox