sql >> Databáze >  >> RDS >> PostgreSQL

Rozdělte daný řetězec a připravte případové prohlášení

Č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í


  1. Jak funguje funkce DateTime() v SQLite

  2. Co je STATISTICS IO v SQL Server?

  3. Jak provedu vložení a vrácení vložené identity pomocí Dapper?

  4. Oracle PL/SQL:Příklad DBMS_SCHEDULER.CREATE_JOB