0

我有一个表,由 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
4

2 回答 2

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小提琴。

对于更复杂的查询或 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只需要保证数组元素的原始顺序。细节:

于 2013-01-10T23:04:57.993 回答
1

如果您有工作表,则可以将其作为连接处理:

select cront.hour, j.name
from cront join
     jobs j
     on ', '||jobs||', ' like '%, '||j.name||', '
于 2013-01-11T00:19:50.650 回答