Подходит для выполнения concat () PostgreSQL вместо || в JOOQ? - PullRequest
0 голосов
/ 29 января 2020

Оператор || и функция concat(...) в PostgreSQL ведут себя по-разному.

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

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

concat(...) игнорирует значения NULL, но NULL в выражении || делает выражение весь результат становится NULL.

В JOOQ DSL.concat() в диалекте PostgreSQL отображает выражения с помощью оператора ||:

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(...) вместо оператора || через JOOQ в PostgreSQL:

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

1 Ответ

1 голос
/ 29 января 2020

Я нашел два способа достижения поставленной цели.

Подход № 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();

В этом решении не используется встроенный SQL с заполнителями в качестве подхода # 1. Почему JOOQ генерирует || вместо concat(...), во-первых, все еще предстоит объяснить.

...