SUM(CASE ...)和CASE WHEN ... THEN SUM(...)之间的区别

时间:2019-02-03 10:36:10

标签: sql postgresql

我遇到过表达式(Postgres):

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input name="myinput" value="">

这让我震惊。是的,SELECT ..., CASE WHEN colXX in (...) THEN sum(colYY) END FROM tbl WHERE ... GROUP BY ..., colXX; 中是否有GROUP BY

任何人都可以确认在CASE WHEN内使用聚合是某些专有的SQL扩展吗?

我通常使用这样的格式:

CASE WHEN

即使SELECT ..., sum(CASE WHEN colXX in (...) THEN colYY END) FROM tbl ...; 不在colXX中并且语义清晰也可以使用。

PostgreSQL和HSQLDB也具有以前形式的漂亮语法:

GROUP BY

所以我的问题是:哪些标准或专有扩展定义了SELECT ..., sum(colYY) FILTER (WHERE colXX in (...)) FROM tbl ...; 内的聚合,这种表达的语义是什么,使用这种构造时会受到哪些限制?

1 个答案:

答案 0 :(得分:2)

所有这三种语法都是ISO / ANSI标准。第三个使用filter仅在少数数据库(Postgres,SQLite的最新版本以及其他一些数据库)中可用。

这些功能完全相同:

sum(colYY) FILTER (WHERE colXX in (...))
sum(CASE WHEN colXX in (...) THEN colYY END)

它们在满足条件的行上求和colYY。这些要求在colXX子句中没有提到的列(colYYGROUP BY都不在)。实际上,如果其中一个在GROUP BY中,通常将使用。

此:

(CASE WHEN colXX in (...) THEN sum(colYY) END)

完全不同。它要求colXXGROUP BY中。它将在colXX条件为真的任何行上计算总和。其他行的值为NULL。根据我的经验,此版本比其他两个版本更不常用。

Here是一个db <>小提琴,用于说明正在发生的事情。