基于模式的转换
适用于 ❌ 开源版 ✅ 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 |
反馈
您对此页面有任何反馈吗? 我们很乐意听到!