sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL - stel een standaard celwaarde in volgens een andere celwaarde

Dit is niet mogelijk met een simpele DEFAULT waarde, zoals duidelijk in de handleiding staat:

De waarde is een variabele-vrije expressie (subquery's en kruisverwijzingen naar andere kolommen in de huidige tabel zijn niet toegestaan).

Je zou een trigger . kunnen gebruiken in plaats daarvan:

CREATE OR REPLACE FUNCTION trg_foo_b_default()
  RETURNS trigger
  LANGUAGE plpgsql AS
$func$
BEGIN
   -- For just a few constant options, CASE does the job:
   NEW.b := CASE NEW.a
               WHEN 'peter'  THEN 'doctor'
               WHEN 'weirdo' THEN 'shrink'
               WHEN 'django' THEN 'undertaker'
               ELSE NULL
            END;

   /*
   -- For more, or dynamic options, consider a lookup table:
   SELECT INTO NEW.b  t.b
   FROM   def_tbl t
   WHERE  t.a = NEW.a;
   */

   RETURN NEW;
END
$func$;


CREATE TRIGGER b_default
BEFORE INSERT ON foo
FOR EACH ROW
WHEN (NEW.b IS NULL AND NEW.a IS NOT NULL)
EXECUTE PROCEDURE trg_foo_b_default();

Gebruik een WHEN . om het efficiënter te maken clausule in de triggerdefinitie (beschikbaar sinds Postgres 9.0):Op deze manier wordt de triggerfunctie alleen uitgevoerd als het echt nuttig is. (Ervan uitgaande dat we b IS NULL kunnen laten schuif als a IS NULL .)

Werkt in een soortgelijk, maar subtiel anders mode van een DEFAULT waarde.
Met een standaardwaarde kunt u expliciet NULL invoegen om de standaard te overschrijven. Dat is hier niet mogelijk, NULL in b wordt vervangen door de waarde afgeleid van a .



  1. PostgreSQL-tabelvariabele

  2. Met behulp van SQL Server opgeslagen procedures van Python (pyodbc)

  3. Problemen oplossen met langlopende query's in MS SQL Server

  4. Welk SqlDbType verwijst naar varBinary(max)?