sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo puedo crear una columna en postgres a partir de valores y selecciones basadas en otras columnas?

Nota importante:crearía una vista basado en su tabla actual y evitó agregar nuevas columnas, ya que desnormalizarán su esquema. Lea más aquí .

Además, usaré nombres en minúsculas para todos los identificadores para evitar que salgan en comillas.

  • para formar GPA_TXT campo puede usar to_char() función:to_char(gpa, 'FM09.0') (la FM evitará el espacio delante de la cadena resultante);
  • para el segundo campo, usaría GPA y no GPA_TXT para la comparación numérica. Puede consultar más en CASE construye en los documentos , pero el bloque podría ser el siguiente:

    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
    

Lo siento, no sé cómo se asignan las calificaciones por GPA, por favor, ajústelo en consecuencia.

La consulta resultante para la vista podría ser (también en 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;

Para crear una vista, simplemente anteponga CREATE VIEW aview AS antes de esta consulta.

EDITAR

Si aún opta por agregar columnas, lo siguiente debería funcionar:

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