可用版本: Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

过滤

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

SQL标准指定了一个可选的FILTER子句,可以附加到所有聚合函数,包括聚合的窗口函数。这非常有用,例如,实现“透视”表,如下所示

SELECT
  count(*),
  count(*) FILTER (WHERE TITLE LIKE 'A%'),
  count(*) FILTER (WHERE TITLE LIKE '%A%')
FROM BOOK
create.select(
         count(),
         count().filterWhere(BOOK.TITLE.like("A%")),
         count().filterWhere(BOOK.TITLE.like("%A%")))
      .from(BOOK)

产生

+-------+-------+-------+
| count | count | count |
+-------+-------+-------+
|     4 |     1 |     2 |
+-------+-------+-------+

或者,使用GROUP BY

SELECT
  AUTHOR_ID,
  count(*),
  count(*) FILTER (WHERE TITLE LIKE 'A%'),
  count(*) FILTER (WHERE TITLE LIKE '%A%')
FROM BOOK
GROUP BY AUTHOR_ID
create.select(
         BOOK.AUTHOR_ID,
         count(),
         count().filterWhere(BOOK.TITLE.like("A%")),
         count().filterWhere(BOOK.TITLE.like("%A%")))
      .from(BOOK)
      .groupBy(BOOK.AUTHOR_ID)

产生

+-----------+-------+-------+-------+
| AUTHOR_ID | count | count | count |
+-----------+-------+-------+-------+
|         1 |     2 |     1 |     1 |
|         2 |     2 |     0 |     1 |
+-----------+-------+-------+-------+

通常最好在单个查询中计算多个聚合函数,如果可能的话,FILTER在这里有所帮助。

只有少数方言实现了对FILTER子句的本机支持。在所有其他数据库中,jOOQ使用CASE 表达式模拟该子句。聚合函数从聚合中排除NULL值。

方言支持

此示例使用 jOOQ

count().filterWhere(BOOK.TITLE.like("A%"))

翻译成以下特定方言的表达式

访问

count(SWITCH(BOOK.TITLE LIKE 'A%', 1))

ASE, Aurora MySQL, DB2, Derby, Exasol, Hana, Informix, MariaDB, MemSQL, MySQL, Oracle, Redshift, SQLDataWarehouse, SQLServer, Sybase, Teradata, Vertica

count(CASE
  WHEN BOOK.TITLE LIKE 'A%' THEN 1
END)

Aurora Postgres, CockroachDB, Databricks, DuckDB, Firebird, H2, HSQLDB, Postgres, SQLite, Trino, YugabyteDB

count(*) FILTER (WHERE BOOK.TITLE LIKE 'A%')

BigQuery

countif((BOOK.TITLE LIKE 'A%'))

ClickHouse

count() FILTER (WHERE BOOK.TITLE LIKE 'A%')

Snowflake

count_if((BOOK.TITLE LIKE 'A%'))
使用 jOOQ 3.21 生成。早期 jOOQ 版本的支持可能有所不同。 在我们的网站上翻译您自己的 SQL

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo