PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como posso criar uma coluna no postgres a partir de valores e seleções com base em outras colunas?


Observação importante:eu criaria uma visualização com base em sua tabela atual e evite adicionar novas colunas, pois elas desnormalizarão seu esquema. Leia mais aqui .

Além disso, usarei nomes em minúsculas para todos os identificadores para evitar qouting.
  • para formar GPA_TXT campo você pode usar to_char() função:to_char(gpa, 'FM09.0') (o FM evitará espaço na frente da string resultante);

  • para o segundo campo, eu usaria GPA e não GPA_TXT para comparação numérica. Você pode conferir mais em CASE construa nos nos documentos , mas o bloco pode ser o seguinte:
    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
    

Desculpe, não sei como as notas são atribuídas por GPA, por favor, ajuste de acordo.

A consulta resultante para a visualização pode ser (também em 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 construir uma visualização, basta acrescentar CREATE VIEW aview AS antes desta consulta.

EDITAR

Se você ainda adicionar colunas, o seguinte deve 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');