PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Podziel podany ciąg i przygotuj instrukcję case

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przewodnik po Pgpool dla PostgreSQL:część pierwsza

  2. Ustaw na stałe ścieżkę schematu Postgresql

  3. Jak działa justify_hours() w PostgreSQL

  4. Zapytanie o szerokość geograficzną PostgreSQL

  5. Zepsuty postgres Homebrew