2013-01-10 59 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||', '