我有一個表,由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
我有一個表,由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
假設你的作業列是逗號分隔的數據類型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;
對於更復雜的查詢,或者如果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只需要保證數組元素的原始順序。詳細信息:
如果你的作業表,可以處理這個作爲一個連接:
select cront.hour, j.name
from cront join
jobs j
on ', '||jobs||', ' like '%, '||j.name||', '
請向我們展示了'CREATE TABLE'爲那張桌子。 –