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.