Java 具有多个数组的unnest的Jooq表示法
我想混合每个位置的外部时区信息,以过滤具有时间戳而没有时区值的行 如何在Jooq中表达这个SQL(Postgresql)片段 不太理想但仍然有效的代码段是:Java 具有多个数组的unnest的Jooq表示法,java,postgresql,jooq,unnest,Java,Postgresql,Jooq,Unnest,我想混合每个位置的外部时区信息,以过滤具有时间戳而没有时区值的行 如何在Jooq中表达这个SQL(Postgresql)片段 不太理想但仍然有效的代码段是: WITH now(locaton, value) AS ( SELECT unnest(ARRAY[1,2]::BIGINT[]) as location, unnest(ARRAY['2017-05-28 09:30','2017-05-28 10:30']::T
WITH
now(locaton, value) AS (
SELECT
unnest(ARRAY[1,2]::BIGINT[]) as location,
unnest(ARRAY['2017-05-28 09:30','2017-05-28 10:30']::TIMESTAMP[]) as value
)
SELECT *
FROM now;
可能更正确的一个(被阻止)
得到
location | value
------------+---------------------
1 | 2017-05-28 09:30:00
2 | 2017-05-28 10:30:00
(2 rows)
我用普通SQL解决了这个问题
DSL
.with("now", "location", "value")
.as(
create
.select(
DSL.field("location"),
DSL.field("value")
)
.from(
DSL
.table(
"UNNEST(?::BIGINT[]) WITH ORDINALITY",
DSL.val(Arrays.asList(1L, 2L).toArray())
)
.as("location")
.join(
DSL
.table(
"UNNEST(?::TIMESTAMP[]) WITH ORDINALITY",
DSL.val(
Arrays.asList(
LocalDateTime.of(2017, 05, 28, 9, 30),
LocalDateTime.of(2017, 05, 28, 10, 30)
).toArray()
)
)
.as("value")
)
.using(
DSL.field("ordinality")
)
)
)
.select()
.from(DSL.table("now"));
哦,非常好的解决方案,使用了带有顺序性的
。也许这个问题应该得到更高的优先级。您仍然可以使用DSL.unnest()
,然后将结果封装在普通的SQL中:DSL.table({0}带序数),DSL.unnest(…)
建议的改进替代品array_table
字符串而不是数组参数。
location | value
------------+---------------------
1 | 2017-05-28 09:30:00
2 | 2017-05-28 10:30:00
(2 rows)
DSL
.with("now", "location", "value")
.as(
create
.select(
DSL.field("location"),
DSL.field("value")
)
.from(
DSL
.table(
"UNNEST(?::BIGINT[]) WITH ORDINALITY",
DSL.val(Arrays.asList(1L, 2L).toArray())
)
.as("location")
.join(
DSL
.table(
"UNNEST(?::TIMESTAMP[]) WITH ORDINALITY",
DSL.val(
Arrays.asList(
LocalDateTime.of(2017, 05, 28, 9, 30),
LocalDateTime.of(2017, 05, 28, 10, 30)
).toArray()
)
)
.as("value")
)
.using(
DSL.field("ordinality")
)
)
)
.select()
.from(DSL.table("now"));