SUM(CASE ...)和CASE之间的差异,当... THEN SUM(...)

问题描述 投票:1回答:1

我碰到的表达(Postgres的):

SELECT
  ...,
  CASE WHEN colXX in (...) THEN sum(colYY) END
FROM tbl
WHERE ...
GROUP BY ..., colXX;

它吹我的脑海里。 OK,它具有意义,如果有GROUP BYCASE WHEN

任何人都可以证实,使用CASE WHEN里面聚集了一些专有的SQL扩展?

我通常用这样的形式:

SELECT
  ...,
  sum(CASE WHEN colXX in (...) THEN colYY END)
FROM tbl ...;

它的工作原理,即使colXXGROUP BY,它有明确的语义。

此外PostgreSQL和HSQLDB有以前的形式花哨的语法:

SELECT
  ...,
  sum(colYY) FILTER (WHERE colXX in (...))
FROM tbl ...;

所以我的问题是:该标准或专有扩展定义聚集内CASE,什么是这样表达的语义,当使用这种结构有什么限制的影响?

sql postgresql
1个回答
2
投票

所有这三个你的语法是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是说明发生了什么分贝<>小提琴。

© www.soinside.com 2019 - 2024. All rights reserved.