0

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

我如何在 Jooq 中表达这个 SQL (Postgresql) 片段

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;

不太理想但仍然有效的片段是:

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;

可能更正确的一个(被添加对 SQL 标准 WITH ORDINALITY 子句的支持阻止 #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)
4

1 回答 1

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"));
于 2017-05-29T12:48:20.127 回答