クリーンセットアップ:
CREATE TABLE tbl (
given_date date
, set_name varchar
);
シングルの列名として単一の用語を使用する 値。
データ型は明らかにdate
timestamp
ではありません 。
テキストパラメータを便利なテーブルに変換するには:
SELECT unnest(string_to_array('2001-01-01to2001-01-05,2001-01-10to2001-01-15', ',')) AS date_range
, unnest(string_to_array('s1,s2', ',')) AS set_name;
「Parallelunnest」は便利ですが、注意点があります。 Postgres 9.4 クリーンなソリューション、Postgres 10を追加します 最終的にこれの振る舞いを消毒しました。以下を参照してください。
動的実行
プリペアドステートメント
プリペアドステートメントは、作成中のセッションにのみ表示され、それとともに終了します。ドキュメントごと:
プリペアドステートメントは、現在のデータベースセッションの間だけ持続します。
PREPARE
セッションごとに1回 :
PREPARE upd_tbl AS
UPDATE tbl t
SET set_name = s.set_name
FROM (
SELECT unnest(string_to_array($1, ',')) AS date_range
, unnest(string_to_array($2, ',')) AS set_name
) s
WHERE t.given_date BETWEEN split_part(date_range, 'to', 1)::date
AND split_part(date_range, 'to', 2)::date;
または、クライアントが提供するツールを使用してステートメントを準備します。
任意のパラメーターを使用してn回実行します:
EXECUTE upd_tbl('2001-01-01to2001-01-05,2001-01-10to2001-01-15', 's1,s4');
サーバー側機能
関数は永続化され、すべてに表示されます セッション。
CREATE FUNCTION
1回 :
CREATE OR REPLACE FUNCTION f_upd_tbl(_date_ranges text, _names text)
RETURNS void AS
$func$
UPDATE tbl t
SET set_name = s.set_name
FROM (
SELECT unnest(string_to_array($1, ',')) AS date_range
, unnest(string_to_array($2, ',')) AS set_name
) s
WHERE t.given_date BETWEEN split_part(date_range, 'to', 1)::date
AND split_part(date_range, 'to', 2)::date
$func$ LANGUAGE sql;
n回呼び出す:
SELECT f_upd_tbl('2001-01-01to2001-01-05,2001-01-20to2001-01-25', 's2,s5');
SQLフィドル
優れたデザイン
配列パラメータ(文字列リテラルとして引き続き提供可能)、daterange
を使用します タイプ(9.3ページの両方)と新しい並列unnest()
(pg 9.4 。
CREATE OR REPLACE FUNCTION f_upd_tbl(_dr daterange[], _n text[])
RETURNS void AS
$func$
UPDATE tbl t
SET set_name = s.set_name
FROM unnest($1, $2) s(date_range, set_name)
WHERE t.given_date <@ s.date_range
$func$ LANGUAGE sql;
<@
「要素は」演算子に含まれています。
電話:
SELECT f_upd_tbl('{"[2001-01-01,2001-01-05]"
,"[2001-01-20,2001-01-25]"}', '{s2,s5}');
詳細:
- 複数のアレイを並列にネスト解除する