PostgreSQL CASE… END com várias condições

97

Aqui está um extrato da minha tabela:

  gid    |    datepose    |    pvc
---------+----------------+------------
 1       |  1961          | 01
 2       |  1949          |
 3       |  1990          | 02
 1       |  1981          |
 1       |                | 03
 1       |                |

Quero preencher a coluna de PVC usando um SELECT CASEcomo abaixo:

SELECT

 gid,

 CASE
  WHEN (pvc IS NULL OR pvc = '') AND datpose < 1980) THEN '01'
  WHEN (pvc IS NULL OR pvc = '') AND datpose >= 1980) THEN '02'
  WHEN (pvc IS NULL OR pvc = '') AND (datpose IS NULL OR datpose = 0) THEN '03'
 END AS pvc

FROM my_table ;

O resultado é o mesmo conteúdo da tabela de origem, nada aconteceu e não recebo nenhuma mensagem de erro nos arquivos pg_log. Pode ser um erro de sintaxe ou um problema com o uso de várias condições nas cláusulas WHEN?

Obrigado pela ajuda e conselhos!

Wiltomap
fonte
Você pode exibir um valor NULL onde é nulo (para que possamos ver a diferença entre NULL e string vazia)? Como em, uma string contendo, NULLpor exemplo
Paco
2
Você também tem um problema com colchetes. Por que há um colchete de fechamento após 1980? (em ambos os lugares)
Paco

Respostas:

155

Este tipo de código talvez deva funcionar para você

SELECT
 *,
 CASE
  WHEN (pvc IS NULL OR pvc = '') AND (datepose < 1980) THEN '01'
  WHEN (pvc IS NULL OR pvc = '') AND (datepose >= 1980) THEN '02'
  WHEN (pvc IS NULL OR pvc = '') AND (datepose IS NULL OR datepose = 0) THEN '03'
  ELSE '00'
 END AS modifiedpvc
FROM my_table;


 gid | datepose | pvc | modifiedpvc 
-----+----------+-----+-------------
   1 |     1961 | 01  | 00
   2 |     1949 |     | 01
   3 |     1990 | 02  | 00
   1 |     1981 |     | 02
   1 |          | 03  | 00
   1 |          |     | 03
(6 rows)
Soni Harriz
fonte
2
Quase perfeito ;-)! Gostaria apenas de substituir ELSE '00'por ELSE pvcpara manter os valores existentes na pvccoluna, caso contrário, eles serão riscados com '00' (maiúsculas e minúsculas pvc IS NOT NULL). Muito obrigado!
wiltomap
Posso pular MAIS?
Zon
O ELSE é opcional. Sem um ELSE, a expressão retornará NULL quando nenhuma das dez cláusulas WHEN corresponder.
Klaws de