Java 具有多个数组的unnest的Jooq表示法

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

我想混合每个位置的外部时区信息,以过滤具有时间戳而没有时区值的行

如何在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']::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"));