合成SQL子句
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
之前提到的大多数 SQL 子句在 jOOQ 支持的至少一种 SQL 方言中都有原生表示。 例如,当像 LPAD()
这样的函数不可用时,jOOQ 会生成一个等效的表达式。
-- MySQL (native support) lpad('a', 10, ' ') -- SQL Server (emulation) (replicate(' ', (10 - len('a'))) + 'a')
// In Java lpad("a", 10, " ")
但是,由于许多 SQL 都是为了方言兼容性而模拟的,因此没有什么可以阻止 jOOQ 支持在任何地方都没有原生表示的合成 SQL 子句。
这方面的一个例子是 量化的 LIKE 谓词,它是在 jOOQ 3.12 中引入的,在任何数据库中都会非常有用。
(TITLE LIKE '%abc%' OR TITLE LIKE '%def%') (TITLE NOT LIKE '%abc%' OR TITLE NOT LIKE '%def%') (TITLE LIKE '%abc%' AND TITLE LIKE '%def%') (TITLE NOT LIKE '%abc%' AND TITLE NOT LIKE '%def%')
BOOK.TITLE.like(any("%abc%", "%def%")) BOOK.TITLE.notLike(any("%abc%", "%def%")) BOOK.TITLE.like(all("%abc%", "%def%")) BOOK.TITLE.notLike(all("%abc%", "%def%"))
在本节中,我们将简要列出大多数此类合成 SQL 子句,这些子句可通过 jOOQ API 和 jOOQ 解析器 获得,但它们在任何方言中都没有原生表示。
-
隐式 JOIN:隐式 JOIN 是从一对一关系路径表达式派生的隐式 LEFT JOIN。 为了例如从
CUSTOMER
记录访问COUNTRY
列,可以编写CUSTOMER.address().city().country().NAME
。 jOOQ 将生成必要的LEFT JOIN
图,这编写起来要繁琐得多。 -
MULTISET_AGG 函数:即使存在 MULTISET 值构造器的原生实现,
MULTISET
聚合函数在任何地方都不受原生支持。 - 关系除法:关系代数支持除法运算符,它是交叉积的逆运算符。
- SEEK 子句:SEEK 子句是 SELECT 语句的一个合成子句,它提供了分页的另一种方式,而不是 OFFSET 子句。 从性能的角度来看,它通常是分页的首选方式。
- SEMI JOIN 和 ANTI JOIN:关系代数定义了 SEMI JOIN 和 ANTI JOIN 运算符,它们在 jOOQ 支持的任何 SQL 方言中都没有表示(虽然 Apache Impala 有)。 在 SQL 中,使用 EXISTS 谓词或 IN 谓词代替。
- 排序间接:排序时,有时我们希望按派生值排序,而不是按列的实际值排序。 排序间接使用 jOOQ 使这变得非常容易。
- UNIQUE 谓词:此 SQL 标准谓词尚未在任何 SQL 方言中实现(H2 正在考虑)。 一个深奥但偶尔有用的谓词,使用 EXISTS 谓词手动模拟它很困难。
- 内联派生表:一种快速且类型安全的方式,可以将 WHERE 子句添加到 表表达式,以简化动态 SQL。
-
ON CONFLICT .. SET ALL TO EXCLUDED 和 ON DUPLICATE KEY .. SET ALL TO EXCLUDED:最常见的
UPSERT
语句的便捷方法。
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!