PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come posso creare una colonna in postgres da valori e selezioni basate su altre colonne?

Nota importante:creerei una vista in base alla tabella corrente ed evitato di aggiungere nuove colonne, poiché denormalizzeranno il tuo schema. Leggi di più qui .

Inoltre, userò nomi minuscoli per tutti gli identificatori per evitare qouting.

  • per formare GPA_TXT campo puoi utilizzare to_char() funzione:to_char(gpa, 'FM09.0') (il FM eviterà lo spazio davanti alla stringa risultante);
  • per il secondo campo, userei GPA e non GPA_TXT per il confronto numerico. Puoi controllare di più su CASE costruire in i documenti , ma il blocco potrebbe essere il seguente:

    CASE WHEN gpa >= 3.3 THEN 'A'
         WHEN gpa > 2.7 AND gpa < 3.3 THEN 'B'
         WHEN gpa > 0 THEN 'C'
         ELSE 'F' END
    

Spiacenti, non so come vengono assegnati i voti per GPA, per favore, aggiusta di conseguenza.

La query risultante per la vista potrebbe essere (anche su SQL Fiddle ):

SELECT name,major,gpa,
       to_char(gpa, 'FM09.0') AS gpa_txt,
       name||'-'||major||'-Grade'||
  CASE WHEN gpa >= 3.3 THEN 'A'
       WHEN gpa > 2.7 AND gpa < 3.3 THEN 'B'
       WHEN gpa > 0 THEN 'C'
       ELSE 'F' END || '-' || to_char(gpa, 'FM09.0') AS adesc
  FROM atab;

Per creare una vista, anteponi CREATE VIEW aview AS prima di questa query.

MODIFICA

Se continui ad aggiungere colonne, quanto segue dovrebbe fare il trucco:

ALTER TABLE atab ADD gpa_txt text, ADD adesc text;
UPDATE atab SET
    gpa_txt = to_char(gpa, 'FM09.0'),
    adesc = name||'-'||major||'-Grade'||
      CASE WHEN gpa >= 3.3 THEN 'A'
           WHEN gpa > 2.7 AND gpa < 3.3 THEN 'B'
           WHEN gpa > 0 THEN 'C'
           ELSE 'F' END || '-' || to_char(gpa, 'FM09.0');