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
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
あなたの仕事の列がデータ型(または同様のもの)のコンマ区切りのリストで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;
より複雑なクエリの場合、または次の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||', '