Postgres Проблема с массивом - PullRequest
1 голос
/ 17 июня 2020

У меня есть таблица, как показано ниже, и я хочу, чтобы выходные данные загружали данные в другую таблицу:

Данные входной таблицы (Tempab c):

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 при импорте из файла, но я хочу загрузить его в целевую таблицу, где это столбец массива типа данных даты:

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

Однако я все еще не могу извлечь дату из столбец ENROLL_DT. Есть ли способ извлечь дату. Кто-нибудь может предложить?

1 Ответ

0 голосов
/ 17 июня 2020

Если вы хотите удалить пустые элементы массивов и изменить их тип данных, вы можете array_remove, unnest, привести значения и, наконец, снова сгруппировать их с помощью 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_remove и unnest, например,

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

Дополнительная информация:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...