具有多个数组的 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 表示法的主要内容,如果未能解决你的问题,请参考以下文章

带有jooq的postgres数组范围表示法

Unnest 2 级别 - Big Query 数组

有没有办法在 JOOQ 中为具有相同表结构的多个模式设置代码生成?

UNNEST 数组并使用 CASE WHEN 分配给新列

jooq 具有一对多关系的单个查询

如何在子查询的 WHERE 子句中使用来自 UNNEST 的多个值?