我有一个表,由 cron 构建。假设它有两列,Hours 和 Jobname。例如:作业 1 运行小时 {1,2,3,4},作业 2 运行小时 {3,4,5,6}。
我需要一个查询,它取消对列小时的分组并列出每小时的工作。
预期输出:
工作时间 工作名称 1 工作 1 2 工作 1 3 工作 1、工作 2 4 工作 1、工作 2 5 工作 2 6 工作 2
我有一个表,由 cron 构建。假设它有两列,Hours 和 Jobname。例如:作业 1 运行小时 {1,2,3,4},作业 2 运行小时 {3,4,5,6}。
我需要一个查询,它取消对列小时的分组并列出每小时的工作。
预期输出:
工作时间 工作名称 1 工作 1 2 工作 1 3 工作 1、工作 2 4 工作 1、工作 2 5 工作 2 6 工作 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;
对于更复杂的查询或 ifjobs
可以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||', '