执行 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(...)
仍有待阐述。
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(...)
仍有待阐述。