Čisté nastavení:
CREATE TABLE tbl (
given_date date
, set_name varchar
);
Jako název sloupce pro jednotlivý použijte výraz v jednotném čísle value.
Datový typ je zjevně date
a nikoli timestamp
.
Chcete-li převést parametry textu do užitečné tabulky:
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;
"Paralelní unnest" je užitečné, ale má svá omezení. Postgres 9.4 přidává čisté řešení, Postgres 10 nakonec toto chování sanovalo. Viz níže.
Dynamické provádění
Připravené prohlášení
Připravené příkazy jsou viditelné pouze pro relaci vytváření a zemřou s ním. Podle dokumentace:
Připravené příkazy trvají pouze po dobu trvání aktuální relace databáze.
PREPARE
jednou za relaci :
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;
Nebo k přípravě výpisu použijte nástroje poskytnuté vaším klientem.
Spustit nkrát s libovolnými parametry:
EXECUTE upd_tbl('2001-01-01to2001-01-05,2001-01-10to2001-01-15', 's1,s4');
Funkce na straně serveru
Funkce jsou trvalé a viditelné pro všechny relace.
CREATE FUNCTION
jednou :
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;
Volejte nkrát:
SELECT f_upd_tbl('2001-01-01to2001-01-05,2001-01-20to2001-01-25', 's2,s5');
SQL Fiddle
Vynikající design
Použijte parametry pole (mohou být stále poskytovány jako řetězcové literály), daterange
type (obě str. 9.3) a nový paralelní unnest()
(str. 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;
<@
jako operátor "prvek je obsažen v".
Volejte:
SELECT f_upd_tbl('{"[2001-01-01,2001-01-05]"
,"[2001-01-20,2001-01-25]"}', '{s2,s5}');
Podrobnosti:
- Uvolněte paralelně několik polí