【问题标题】:Postgres Array IssuePostgres 数组问题
【发布时间】:2020-06-17 04:26:56
【问题描述】:

我有一个如下表,并希望将输出的数据加载到另一个表中:

输入表数据(Tempabc):

ID,COURSE,ENROLL_DT
'12345fgh-2bce-467f',array['BB','TT',''],array['01/07/2007 12:00:00 AM','15/09/2007 12:00:00 AM',''],
'1234rty-863d-4e4f',array['CRKT','HKY',''],array['01/01/2005 12:00:00 AM','01/07/2012 12:00:00 AM','']

输出数据:

ID,COURSE,ENROLL_DT
'12345fgh-2bce-467f',array['BB','TT'],array['01/07/2007','15/09/2007'],
'1234rty-863d-4e4f',array['CRKT','HKY'],array['01/01/2005','01/07/2012']

请大家帮忙。我使用了以下查询,但无法从第三列中提取日期。第三列是从文件导入时的 varchar 列,但我想将其加载到目标表,其中它是 Date 数据类型 Array 列:

SELECT ID,
ARRAY_REMOVE(COURSE,'') AS COURSE,ARRAY_REMOVE(ENROLL_DT,'') AS ENROLL_DT
FROM TEMPABC;

但是,我仍然无法从 ENROLL_DT 列中提取日期。有没有办法提取日期。有人可以建议吗?

【问题讨论】:

    标签: sql arrays postgresql


    【解决方案1】:

    如果你想删除数组的空白元素并改变它们的数据类型,你可以array_removeunnest,转换这些值,最后用array_agg再次分组,例如

    WITH tempabc (id,course,enroll_dt) AS ( 
    VALUES
      ('12345fgh-2bce-467f',array['BB','TT',''],array['01/07/2007 12:00:00 AM','15/09/2007 12:00:00 AM','']),
      ('1234rty-863d-4e4f',array['CRKT','HKY',''],array['01/01/2005 12:00:00 AM','01/07/2012 12:00:00 AM',''])
    )
    SELECT id, array_agg(course) AS course, array_agg(enroll_dt) AS enroll_dt FROM (
      SELECT id,
        unnest(array_remove(course,'')) AS course,
        unnest(array_remove(enroll_dt,''))::date AS enroll_dt
      FROM tempabc) q
    GROUP BY id;
    
             id         |   course   |        enroll_dt        
    --------------------+------------+-------------------------
     12345fgh-2bce-467f | {BB,TT}    | {2007-07-01,2007-09-15}
     1234rty-863d-4e4f  | {CRKT,HKY} | {2005-01-01,2012-07-01}
    

    如果您的目标是为每个数组值创建一条记录,只需 array_removeunnest,例如

    WITH tempabc (id,course,enroll_dt) AS ( 
    VALUES
      ('12345fgh-2bce-467f',array['BB','TT',''],array['01/07/2007 12:00:00 AM','15/09/2007 12:00:00 AM','']),
      ('1234rty-863d-4e4f',array['CRKT','HKY',''],array['01/01/2005 12:00:00 AM','01/07/2012 12:00:00 AM',''])
    )
    SELECT id,
      unnest(array_remove(course,'')) AS course,
      unnest(array_remove(enroll_dt,''))::date AS enroll_dt
    FROM tempabc;
    
             id         | course | enroll_dt  
    --------------------+--------+------------
     12345fgh-2bce-467f | BB     | 2007-07-01
     12345fgh-2bce-467f | TT     | 2007-09-15
     1234rty-863d-4e4f  | CRKT   | 2005-01-01
     1234rty-863d-4e4f  | HKY    | 2012-07-01
    

    进一步阅读:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2021-12-02
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多