我有一张桌子,是用cron建造的。 可以说它有两列,小时和作业名称。例如:工作1运行数小时{1,2,3,4},工作2运行数小时{3,4,5,6}。
我需要一个查询,它将列小时分组并列出每小时的作业。
预期产出:
Hours Job Name 1 Job 1 2 Job 1 3 Job 1, Job2 4 Job 1, Job2 5 Job 2 6 Job 2
答案 0 :(得分:2)
假设您的jobs列是以逗号分隔的数据类型text
(或类似)列表 - 由', '
分隔 - 我将其转换为{{3然后string_to_array()
分隔行:
SELECT hour, unnest(string_to_array(jobs, ', ')) AS job
FROM tbl
ORDER BY 1;
您也可以使用unnest()
,这更简单但不会缩放更长的字符串。
相关问题:
在Postgres 9.3 或更高版本中,请改为使用LATERAL
加入。假设查询简单且作业已定义为NOT NULL
,则此方法可以正常工作,并且通常会根据元素的原始顺序返回作业:
SELECT hour, job
FROM tbl, unnest(string_to_array(jobs, ', ')) job -- implicitly LATERAL
ORDER BY 1;
Count the number of rows that contain a letter/number
对于更复杂的查询或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 :(得分:1)
如果您有一份工作表,可以将其作为联接方式进行处理:
select cront.hour, j.name
from cront join
jobs j
on ', '||jobs||', ' like '%, '||j.name||', '