我遇到过表达式(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 ...;
内的聚合,这种表达的语义是什么,使用这种构造时会受到哪些限制?
答案 0 :(得分: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是一个db <>小提琴,用于说明正在发生的事情。