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

aoyhnmkz  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(120)

||-运算符和concat(...)-函数在PostgreSQL中的行为不同。

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


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

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

ifsvaxew

ifsvaxew1#

我找到了两种方法来实现提出的目标。
方法一:

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

字符串
这有预期的行为,但需要在我眼中丑陋的"concat({0})" .从我的Angular 来看,一个更优雅的方法是:
方法2:

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


这个解决方案不像方法#1那样涉及带有占位符的内联SQL。但是,为什么JOOQ首先生成||而不是concat(...)还有待说明。

相关问题