PostgreSQL CASE… END con più condizioni


97

Ecco un estratto della mia tabella:

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

Voglio riempire la colonna in PVC usando SELECT CASEcome sotto:

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 ;

Il risultato è lo stesso contenuto della tabella di origine, non è successo nulla e non ricevo messaggi di errore nei file pg_log. Potrebbe essere un errore di sintassi o un problema con l'utilizzo di più condizioni all'interno delle clausole WHEN?

Grazie per aiuto e consigli!


Puoi visualizzare un valore NULL dove è nullo (quindi possiamo vedere la differenza tra NULL e stringa vuota)? Come in, una stringa contenente NULLad esempio
Paco

2
Hai anche un problema con le parentesi. Perché c'è una parentesi di chiusura dopo il 1980? (in entrambi i posti)
Paco

Risposte:


155

Questo tipo di codice forse dovrebbe funzionare per te

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
Quasi perfetto ;-)! Vorrei solo sostituire ELSE '00'con in ELSE pvcmodo da poter mantenere i valori esistenti nella pvccolonna, altrimenti sono graffiati con '00' (case pvc IS NOT NULL). Molte grazie!
wiltomap

Posso saltare ALTRO?
Zon

L'ALTRO è opzionale. Senza ELSE, l'espressione restituirà NULL quando nessuna delle dieci clausole WHEN corrisponde.
Klaws
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.