it-swarm-eu.dev

Nastavit výchozí hodnotu sloupce na zřetězení hodnot dvou dalších sloupců?

Mám databázi Postgresql 8.1. V jedné tabulce jsou tři sloupce: first_name, last_name, display_name.

Je možné nastavit výchozí hodnotu display_name být first_name + " " + last_name?

13
MattSayar

Použijte spoušť.

Zde je nějaký kód, který můžete použít jako základnu. Pokud také potřebujete zpracovat UPDATE, je nutná pouze malá změna.

 create table people
 (
   first_name varchar(20),
   last_name varchar(20),
   display_name varchar(40)
 );
CREATE TABLE
 CREATE OR REPLACE FUNCTION people_insert() RETURNS trigger AS '
     BEGIN
         NEW.display_name := NEW.first_name||'' ''||NEW.last_name;
         RETURN NEW;
     END;
 ' LANGUAGE plpgsql;

 postgres=# CREATE FUNCTION


 CREATE TRIGGER people_insert BEFORE INSERT OR UPDATE ON people FOR 
 EACH ROW EXECUTE PROCEDURE people_insert();

postgres=# CREATE TRIGGER
 insert into people values ('Larry','Ellison');

postgres=# INSERT 0 1

 postgres=# select * from people;
 first_name | last_name | display_name
------------+-----------+---------------
 Larry      | Ellison   | Larry Ellison
(1 row)

postgres=#
16
Philᵀᴹ

Nemusíte vlastně kládat hodnotu; můžete vytvořit funkci, na kterou lze odkazovat podobně jako vygenerovaný sloupec. Jedním z důvodů je, že odkazy musí být vždy označeny názvem tabulky nebo aliasu.

CREATE TABLE person
  (
    id int PRIMARY KEY,
    first_name text,
    last_name text NOT NULL
  );

INSERT INTO person
  VALUES
    (1, 'John', 'Smith'),
    (2, 'Jane', 'Doe'),
    (3, NULL, 'Prince');

CREATE FUNCTION display_name(rec person)
  RETURNS text
  STABLE
  LANGUAGE SQL
  COST 5
AS $$
  SELECT
    CASE
      WHEN $1.first_name IS NULL THEN ''
      ELSE $1.first_name || ' '
    END || $1.last_name;
$$;

SELECT p.id, p.display_name FROM person p;

Výsledky:

 id | display_name 
 ---- + -------------- 
 1 | John Smith 
 2 | Jane Doe 
 3 | Prince 
 (3 řádky) 

Můžete dokonce indexovat vygenerovanou hodnotu, včetně použití KNN vyhledávání na základě trigramové podobnosti. Například:

CREATE EXTENSION pg_trgm;

CREATE INDEX person_trgm_name
  ON person
  USING Gist
  (display_name(person) Gist_trgm_ops);

SELECT
    p.id,
    p.display_name,
    similarity(p.display_name, 'Jane')
  FROM person p
  ORDER BY p.display_name <-> 'Jane'
  LIMIT 2;

Tento typ vyhledávání vrací řádky z indexového skenování v pořadí „vzdálenost“ od vyhledávacího řetězce. Pokud chcete vidět, jak jsou "blízko", můžete použít operátor vzdálenosti (<->) Nebo funkci similarity() (což je 1 - vzdálenost). Hledání KNN může vrátit K „nejbližší sousedy“ velmi rychle, a to i s velmi velkým množstvím dat.

17
kgrittn

S nastavením VÝCHOZÍ v tabulce sloupců, ne.

Vaše nejlepší sázka je TRIGGER s NOVOU hodnotou pro každý sloupec, který chcete vypočítat.

2
rfusca