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();
反馈
您对此页面有任何反馈吗? 我们很乐意倾听!