具有多个数组的 unnest 的 Jooq 表示法
Posted
技术标签:
【中文标题】具有多个数组的 unnest 的 Jooq 表示法【英文标题】:Jooq notation for unnest with multiple arrays 【发布时间】:2017-05-29 06:28:53 【问题描述】:我想混合外部每个位置的时区信息来过滤具有没有时区的时间戳值的行。
我如何在 Jooq 中表达这个 SQL (Postgresql) sn-p
WITH
now(locaton, value) AS (
SELECT
*
FROM unnest(
ARRAY[1,2]::BIGINT[],
ARRAY['2017-05-28 09:30','2017-05-28 10:30']::TIMESTAMP[])
)
SELECT *
FROM now;
不太理想但仍在工作的 sn-p 是:
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;
可能更正确的一个(被Add support for the SQL Standard WITH ORDINALITY clause #5799屏蔽)
SELECT location, value
FROM
unnest(ARRAY[1,2]::BIGINT[]) WITH ORDINALITY as location
JOIN unnest(ARRAY['2017-05-28 09:30','2017-05-28 10:30']::TIMESTAMP[]) WITH ORDINALITY as value
USING (ordinality);
得到
location | value
------------+---------------------
1 | 2017-05-28 09:30:00
2 | 2017-05-28 10:30:00
(2 rows)
【问题讨论】:
哦,使用WITH ORDINALITY
的解决方案非常好。也许这个问题应该得到更高的优先级。
【参考方案1】:
好吧,我用普通的 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 WITH ORDINALITY", DSL.unnest(...))
建议的改进用array_table
字符串代替数组参数。以上是关于具有多个数组的 unnest 的 Jooq 表示法的主要内容,如果未能解决你的问题,请参考以下文章