执行 PostgreSQL 的 concat() 而不是 || 的方法在JOOQ?

Approaches to execute PostgreSQL's concat() instead of || in JOOQ?

PostgreSQL 中的 || 运算符和 concat(...) 函数表现不同。

select 'ABC'||NULL||'def';
-- Result: NULL

select concat('ABC', NULL, 'def');
-- Result: 'ABCdef'

concat(...) 忽略 NULL 值,但 || 表达式中的 NULL 会使整个结果变为 NULL。

在 JOOQ 中,PostgreSQL 方言中的 DSL.concat() 使用 ||-运算符呈现表达式:

Java: dsl.select(
        DSL.concat(
          DSL.inline("ABC"), 
          DSL.inline(null, SQLDataType.VARCHAR), 
          DSL.inline("def"))
      ).execute();
SQL: select ('ABC' || null || 'def')
Result: NULL

我正在寻找(优雅的?)方法来通过 PostgreSQL 中的 JOOQ 调用 concat(...)-函数而不是 ||-运算符:

Java: dsl.select(???).execute();
SQL: select concat('ABC', null, 'def')
Result: 'ABCdef'

我找到了两种实现姿势的方法objective。

方法 #1:

dsl.select(
  field(
    "concat({0})",
    SQLDataType.VARCHAR,
    list(
      inline("ABC"), 
      inline(null, SQLDataType.VARCHAR), 
      inline("def")
    )
  )
).execute();

这必须符合预期的行为,但需要在我眼中丑陋 "concat({0})"。从我的角度来看,更优雅的方法是:

方法 #2:

dsl.select(
  function(
    "concat", 
    SQLDataType.VARCHAR, 
    inline("ABC"), 
    inline(null, SQLDataType.VARCHAR), 
    inline("def")
  )
).execute();

此解决方案不涉及使用占位符作为方法 #1 的内联 SQL。不过,为什么 JOOQ 首先生成 || 而不是 concat(...) 仍有待阐述。