代码之家  ›  专栏  ›  技术社区  ›  rigyt

数组上的Postgresql ARRAY_AGG只返回第一个值

  •  0
  • rigyt  · 技术社区  · 3 年前

    在Postgres 10中,我遇到了将整数转换为工作日名称并通过ARRAY_AGG将所有记录值分组以形成字符串的问题。

    以下子查询 只返回第一个值 在由timetable_preriods.day(整数)索引的数组中

    SELECT ARRAY_TO_STRING(ARRAY_AGG((ARRAY['Mon','Tue','Wed','Thu','Fri','Sat','Sun'])[timetable_periods.day]), '-')
    FROM timetable_periods
    WHERE courses.id = timetable_periods.course_id
    GROUP BY timetable_periods.course_id
    

    而这显示了所有连接在字符串中的日子,正如预期的那样:

    SELECT ARRAY_TO_STRING(ARRAY_AGG(timetable_periods.day), ', ')
    FROM timetable_periods
    WHERE courses.id = timetable_periods.course_id
    GROUP BY timetable_periods.course_id
    

    例如,一门课程有两个时间表周期,日期值分别为0和2(即周一和周三) 第一个查询只返回“Tue”,而不是“Mon,Wed”(因此既是索引问题,也只返回第一天)。 第二个查询按预期返回“0,2”

    我在使用ARRAY(周名)时做错了什么吗? 谢谢

    更新:上面的查询是子查询,课程表在主查询的FROM中

    0 回复  |  直到 3 年前
        1
  •  1
  •   Steffen Bobek    3 年前

    您应该发布正确的SQL语句。我怀疑 JOIN 属于 课程 时间表_周期 但是 课程 中缺少 FROM 条款此外,两个查询都包含 AND 然后 GROUP BY -这是行不通的。

    从你的文章中,我想你想要这样的东西:

    select
        c.id,
        string_agg((array['Mon','Tue','Wed','Thu','Fri','Sat','Sun'])[tp.day + 1], ', ') as day_names
    from
        courses c
        inner join timetable_periods tp on c.id = tp.course_id
    group by
        c.id
    

    您尝试访问日期名称数组的操作非常正确。但是索引数组是 1-based 。连接文本值可以使用 string_agg .