可用版本:Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17

基于模式的转换

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

从 jOOQ 3.16 开始,添加了一个新的 查询对象模型 (QOM) API,该 API 具有 遍历替换 SPI。 替换的一个现成应用是模式转换,我们识别查询表达式中的常见模式,并允许用更好的表达式替换它们。

例如,可以进行以下转换

-- With Settings.transformPatternsTrim active, this:
SELECT RTRIM(LTRIM(col)) FROM tab;

-- ... is transformed into the equivalent expression:
SELECT TRIM(col) FROM tab;

整个功能集默认情况下处于停用状态,使用 Settings.transformPatterns 标志,因为遍历开销不能保证默认情况下激活。 此功能激活的常见用例包括

  • SQL 检查,包括作为 ExecuteListener 的一部分,其中可以在仅在集成测试期间的实用程序运行中控制工作量,例如。
  • SQL 清理,包括作为 ParsingConnection 的一部分,默认情况下输入/输出会被缓存。
  • 方言迁移,当从功能较弱的方言迁移到功能更强大的方言或新版本时,手动编写的模拟可能会变得过时。
  • 仅修补特定的 SQL 功能

可以批量开启单个功能并单独选择退出,也可以单独开启每个功能,具体取决于用例。

重复模式替换

作为任何 替换 SPI 实现,该算法迭代 jOOQ 表达式树,直到它不能再替换任何东西,即直到转换稳定为止。 例如,以下转换序列是可能的

-- Original SQL
SELECT NOT(1 = 0) AND 1 = 1;

-- Step 1: Settings.transformPatternsNotComparison
SELECT 1 != 0 AND 1 = 1;

-- Step 2: Settings.transformPatternsTrivialPredicates
SELECT TRUE AND TRUE;

-- Step 3: Settings.transformPatternsTrivialPredicates
SELECT TRUE;

特定于方言的结果

以下各节将提出诸如 1 / TAN(x)COS(x) / SIN(x)COT(x) 替换的声明,例如,参见 三角函数。 某些方言可能不支持 COT() 的本机支持,因此将在这些方言上模拟它,从而使转换实际上是多余的。 但是这些事情发生在不同的时间

  • 此模式转换功能可以由用户显式调用,也可以通过配置启用,然后在所有渲染发生之前发生,对于顶级 org.jooq.QueryPart 只发生一次
  • SQL 的渲染会调用上述模拟, SQL 被转换之后

换句话说,这两个操作彼此不了解。

目录

3.24.9.9.1.
AND到NOT IN
3.24.9.9.2.
算术比较
3.24.9.9.3.
算术表达式
3.24.9.9.4.
BIT_GET函数
3.24.9.9.5.
BIT_SET函数
3.24.9.9.6.
CASE searched到CASE simple
3.24.9.9.7.
CASE到CASE缩写
3.24.9.9.8.
CASE与DISTINCT FROM到DECODE
3.24.9.9.9.
带有 ELSE NULL 的 CASE
3.24.9.9.10.
COUNT(*)标量子查询比较
3.24.9.9.11.
COUNT(const)
3.24.9.9.12.
COUNT(expr)标量子查询比较
3.24.9.9.13.
DISTINCT FROM NULL
3.24.9.9.14.
空标量子查询
3.24.9.9.15.
展平CASE
3.24.9.9.16.
展平CASE缩写
3.24.9.9.17.
展平DECODE
3.24.9.9.18.
双曲线函数
3.24.9.9.19.
幂等函数重复
3.24.9.9.20.
反双曲线函数
3.24.9.9.21.
对数函数
3.24.9.9.22.
合并AND谓词
3.24.9.9.23.
合并BIT_NOT与BIT_NAND
3.24.9.9.24.
合并BIT_NOT与BIT_NOR
3.24.9.9.25.
合并BIT_NOT与BIT_XNOR
3.24.9.9.26.
合并CASE .. WHEN和ELSE子句
3.24.9.9.27.
合并CASE .. WHEN子句
3.24.9.9.28.
合并IN谓词
3.24.9.9.29.
合并NOT与比较谓词
3.24.9.9.30.
合并NOT与DISTINCT谓词
3.24.9.9.31.
合并OR谓词
3.24.9.9.32.
合并范围谓词
3.24.9.9.33.
规范化结合操作
3.24.9.9.34.
规范化字段与值比较
3.24.9.9.35.
规范化IN列表单元素为比较
3.24.9.9.36.
NOT AND
3.24.9.9.37.
NOT OR
3.24.9.9.38.
NULL ON NULL INPUT
3.24.9.9.39.
OR转IN
3.24.9.9.40.
重复的算术否定
3.24.9.9.41.
重复的按位否定
3.24.9.9.42.
重复的NOT
3.24.9.9.43.
简化CASE缩写
3.24.9.9.44.
三角函数
3.24.9.9.45.
Trim
3.24.9.9.46.
平凡的按位操作
3.24.9.9.47.
平凡的CASE缩写
3.24.9.9.48.
平凡的谓词
3.24.9.9.49.
不必要的DISTINCT
3.24.9.9.50.
不必要的EXISTS子查询子句
3.24.9.9.51.
不必要的GROUP BY表达式
3.24.9.9.52.
不必要的INNER JOIN
3.24.9.9.53.
不必要的ORDER BY表达式
3.24.9.9.54.
不必要的标量子查询
3.24.9.9.55.
不可达的CASE子句
3.24.9.9.56.
不可达的DECODE子句

上一节:不必要的算术表达式 : 下一节:AND 转换为 NOT IN

反馈

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

The jOOQ Logo