Czysta konfiguracja:
CREATE TABLE tbl (
given_date date
, set_name varchar
);
Użyj pojedynczego terminu jako nazwy kolumny dla singli wartość.
Typ danych to oczywiście date
a nie timestamp
.
Aby przekształcić parametry tekstowe w przydatną tabelę:
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;
„Parallel unnest” jest przydatny, ale ma swoje zastrzeżenia. Postgres 9.4 dodaje czyste rozwiązanie, Postgres 10 ostatecznie oczyściło zachowanie tego. Zobacz poniżej.
Dynamiczne wykonanie
Przygotowane oświadczenie
Przygotowane zestawienia są widoczne tylko dla sesji tworzącej i giną wraz z nią. Zgodnie z dokumentacją:
Przygotowane zestawienia trwają tylko przez czas trwania bieżącej sesji bazy danych.
PREPARE
raz na sesję :
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;
Lub użyj narzędzi dostarczonych przez klienta, aby przygotować zestawienie.
Wykonaj n razy z dowolnymi parametrami:
EXECUTE upd_tbl('2001-01-01to2001-01-05,2001-01-10to2001-01-15', 's1,s4');
Funkcja po stronie serwera
Funkcje są utrwalane i widoczne dla wszystkich sesje.
CREATE FUNCTION
raz :
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;
Zadzwoń n razy:
SELECT f_upd_tbl('2001-01-01to2001-01-05,2001-01-20to2001-01-25', 's2,s5');
Skrzypce SQL
Doskonały projekt
Użyj parametrów tablicowych (nadal mogą być dostarczone jako literały ciągu), daterange
type (obie strony 9.3) i nowy równoległy 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;
<@
będąc operatorem „element jest zawarty w”.
Zadzwoń:
SELECT f_upd_tbl('{"[2001-01-01,2001-01-05]"
,"[2001-01-20,2001-01-25]"}', '{s2,s5}');
Szczegóły:
- Rozgrupuj wiele tablic równolegle