0

cronから構築されたテーブルがあります。Hours と Jobname の 2 つの列があるとします。例: ジョブ 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代わりに結合を使用します。クエリが単純で、 job が定義されていると仮定するとNOT NULL、これは機能し、通常は要素の元の順序に従ってジョブを返します。

SELECT hour, job
FROM   tbl, unnest(string_to_array(jobs, ', ')) job  -- implicitly LATERAL
ORDER  BY 1;

SQL フィドル。

より複雑なクエリの場合、または次の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 ORDINALITYPostgres 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 に答える