我碰到的表达(Postgres的):
SELECT
...,
CASE WHEN colXX in (...) THEN sum(colYY) END
FROM tbl
WHERE ...
GROUP BY ..., colXX;
它吹我的脑海里。 OK,它具有意义,如果有GROUP BY
为CASE WHEN
。
任何人都可以证实,使用CASE WHEN
里面聚集了一些专有的SQL扩展?
我通常用这样的形式:
SELECT
...,
sum(CASE WHEN colXX in (...) THEN colYY END)
FROM tbl ...;
它的工作原理,即使colXX
不GROUP BY
,它有明确的语义。
此外PostgreSQL和HSQLDB有以前的形式花哨的语法:
SELECT
...,
sum(colYY) FILTER (WHERE colXX in (...))
FROM tbl ...;
所以我的问题是:该标准或专有扩展定义聚集内CASE
,什么是这样表达的语义,当使用这种结构有什么限制的影响?
所有这三个你的语法是ISO / ANSI标准。第三,使用filter
只有在少数的数据库(Postgres的,在SQLite的最新版本,和其他一些)可用。
这些做同样的事情:
sum(colYY) FILTER (WHERE colXX in (...))
sum(CASE WHEN colXX in (...) THEN colYY END)
他们总结colYY
在其中满足条件的行。这些要求,没有提到的列(既不colXX
也不colYY
)是GROUP BY
子句。事实上,这些通常不会被如果任何人在GROUP BY
使用。
这个:
(CASE WHEN colXX in (...) THEN sum(colYY) END)
是完全不同的。它要求colXX
是在GROUP BY
。它将计算在其中colXX
条件为真,任何行的总和。其他行将具有NULL
值。根据我的经验,却较少需要这个版本,那么其他两个。
Here是说明发生了什么分贝<>小提琴。