PostgreSQL CASE… END con múltiples condiciones

97

Aquí hay un extracto de mi tabla:

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

Quiero llenar la columna de PVC usando SELECT CASEcomo se muestra a continuación:

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 ;

El resultado es el mismo contenido que la tabla de origen, no ha sucedido nada y no recibo ningún mensaje de error en los archivos pg_log. ¿Podría ser un error de sintaxis o un problema con el uso de múltiples condiciones dentro de las cláusulas WHEN?

¡Gracias por tu ayuda y consejo!

wiltomap
fuente
¿Puede mostrar un valor NULL donde es nulo (para que podamos ver la diferencia entre NULL y una cadena vacía)? Como en, una cadena que contiene, NULLpor ejemplo
Paco
2
También tiene un problema con los corchetes. ¿Por qué hay un paréntesis de cierre después de 1980? (en ambos lugares)
Paco

Respuestas:

156

Este tipo de código quizás debería funcionar para usted

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
fuente
2
Casi perfecto ;-)! Simplemente reemplazaría ELSE '00'con ELSE pvcpara poder mantener los valores existentes en la pvccolumna, de lo contrario, se rayan con '00' (caso pvc IS NOT NULL). ¡Muchas gracias!
wiltomap
¿Puedo omitir ELSE?
Zon
ELSE es opcional. Sin ELSE, la expresión devolverá NULL cuando ninguna de las diez cláusulas WHEN coincida.
Klaws