2013-01-10 84 views
0

我有一个表,由cron构建。 可以说它有两列,小时和工作名称。例如:作业1运行数小时{1,2,3,4},作业2运行数小时{3,4,5,6}。在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||', '