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!


¿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)

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.