2013-01-10 24 views
0

У меня есть стол, построенный из cron. Допустим, что у него есть два столбца: Часы и Имя. например: Job 1 работает в течение часа {1,2,3,4}, а работа 2 работает в течение часа {3,4,5,6}.ungroup a column in postgres

Мне нужен запрос, который не содержит столбцов часов и перечисляет задания за каждый час.

Ожидаемый результат:

 
Hours  Job Name 
1   Job 1 
2   Job 1 
3   Job 1, Job2 
4   Job 1, Job2 
5   Job 2 
6   Job 2 
+0

Пожалуйста, покажите нам 'CREATE TABLE' для эта таблица. –

ответ

2

Если предположить, что столбец рабочих мест является запятыми списка типов данных text (или аналогичных) - разделенных ', ' - преобразовать его в массив с string_to_array(), а затем unnest() его в отдельных строках:

SELECT hour, unnest(string_to_array(jobs, ', ')) AS job 
FROM tbl 
ORDER BY 1; 

Вы можете также использовать regexp_split_to_table(jobs, ', '), который проще, но не масштабируется, а также с более длинными строками.

Похожие вопросы:

В Postgres 9,3 или более поздней версии, используйте LATERAL присоединиться вместо этого. Предполагая, что запрос является простой и работы определяется NOT NULL, это работает, и обычно возвращают рабочие места в соответствии с первоначальным порядком элементов:

SELECT hour, job 
FROM tbl, unnest(string_to_array(jobs, ', ')) job -- implicitly LATERAL 
ORDER BY 1; 

SQL Fiddle.

Для более сложных запросов или если jobs может быть NULL:

SELECT hour, job 
FROM tbl 
LEFT JOIN LATERAL unnest(string_to_array(jobs, ', ')) 
     WITH ORDINALITY AS j(job, ord) ON TRUE 
ORDER BY hour, ord; 

WITH ORDINALITY требует Postgres 9.4 необходимо только гарантия оригинальный порядок элементов массива. Реквизиты:

1

Если у вас есть таблица заданий, вы можете подойти к этому как присоединиться:

select cront.hour, j.name 
from cront join 
    jobs j 
    on ', '||jobs||', ' like '%, '||j.name||', '