PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment puis-je créer une colonne dans postgres à partir de valeurs et de sélections basées sur d'autres colonnes ?

Remarque importante :je créerais une vue en fonction de votre table actuelle et évitez d'ajouter de nouvelles colonnes, car elles dénormaliseront votre schéma. En savoir plus ici .

De plus, j'utiliserai des noms en minuscules pour tous les identifiants afin d'éviter les citations.

  • pour former GPA_TXT vous pouvez utiliser to_char() fonction :to_char(gpa, 'FM09.0') (la FM évitera l'espace devant la chaîne résultante);
  • pour le deuxième champ, j'utiliserais GPA et non GPA_TXT pour la comparaison numérique. Vous pouvez vérifier plus sur CASE construire dans la documentation , mais le bloc pourrait être le suivant :

    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
    

Désolé, je ne sais pas comment les notes sont attribuées par GPA, veuillez ajuster en conséquence.

La requête résultante pour la vue peut être (également sur 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;

Pour créer une vue, ajoutez simplement CREATE VIEW aview AS avant cette requête.

MODIFIER

Si vous optez toujours pour l'ajout de colonnes, ce qui suit devrait faire l'affaire :

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');