PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann ich eine Spalte in Postgres aus Werten und Auswahlen basierend auf anderen Spalten erstellen?

Wichtiger Hinweis:Ich würde eine Ansicht erstellen basierend auf Ihrer aktuellen Tabelle und vermeiden Sie das Hinzufügen neuer Spalten, da diese Ihr Schema denormalisieren würden. Lesen Sie mehr hier .

Außerdem werde ich Kleinbuchstaben für alle Bezeichner verwenden, um Anführungszeichen zu vermeiden.

  • um GPA_TXT zu bilden Feld können Sie to_char() verwenden Funktion:to_char(gpa, 'FM09.0') (die FM vermeidet Leerzeichen vor dem resultierenden String);
  • Für das zweite Feld würde ich GPA verwenden und nicht GPA_TXT zum Zahlenvergleich. Weitere Informationen finden Sie unter CASE Konstrukt in den Dokumenten , aber der Block könnte der folgende sein:

    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
    

Tut mir leid, ich weiß nicht, wie Noten pro GPA vergeben werden, bitte passen Sie sie entsprechend an.

Die resultierende Abfrage für die Ansicht könnte (auch auf SQL Fiddle ) lauten ):

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;

Um eine Ansicht zu erstellen, stellen Sie einfach CREATE VIEW aview AS voran vor dieser Abfrage.

BEARBEITEN

Wenn Sie immer noch Spalten hinzufügen möchten, sollte Folgendes ausreichen:

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