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

ON NULL INPUT特性

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

此特性既确定了优化器使用的约定,也影响了函数的行为。

大多数内置 SQL 函数在任何参数为 NULL 时立即返回 NULL。 例如 SUBSTRING (jOOQ 手册参考:SUBSTRING)

create.select(
  substring("abc"             , 2)                 .as("s1"),
  substring("abc"             , val(null, INTEGER)).as("s2"),
  substring(val(null, VARCHAR), 2)                 .as("s3"),
  substring(val(null, VARCHAR), val(null, INTEGER)).as("s4"),
).fetchOne();

产生

+----+--------+--------+--------+
| s1 | s2     | s3     | s4     |
+----+--------+--------+--------+
| bc | {null} | {null} | {null} |
+----+--------+--------+--------+

虽然手动实现很容易,但仅使用该特性来实现此标准行为,甚至防止调用该函数,从而防止来自上下文切换等的开销,既方便又对优化器有帮助。

如果您的方言不原生支持,jOOQ 将简单地将您的函数体包装在 IF 语句 中,以检查参数值的可空性。

Parameter<Integer> i1 = in("i1", INTEGER);
Parameter<Integer> i2 = in("i2", INTEGER);

// The function always returns NULL if any argument value is NULL
create.createFunction("my_sum")
      .parameters(i1, i2)
      .returns(INTEGER)
      .returnsNullOnNullInput()
      .as(return_(i1.plus(i2)))
      .execute();

// The function may not return NULL if any argument value is NULL
create.createFunction("my_null_safe_sum")
      .parameters(i1, i2)
      .returns(INTEGER)
      .calledOnNullInput()
      .as(return_(coalesce(i1, 0).plus(coalesce(i2, 0))))
      .execute();

反馈

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

The jOOQ Logo