我有一个表,由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'为那张桌子。 –