2015-01-06 17 views
30

Ecco un estratto del mio tavolo:PostgreSQL CASE ... END con condizioni multiple

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

voglio riempire la colonna di PVC con un SELECT CASE come muggito:

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 l'aiuto e il consiglio!

+0

Si può visualizzare un valore NULL in cui è nullo (in modo che possiamo vedere la differenza tra NULL e stringa vuota)? Come in, una stringa contenente 'NULL' ad esempio – Paco

+2

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

risposta

56

Questo tipo di codice, forse dovrebbe funzionare per voi

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) 
+1

Quasi perfetto ;-)! Sostituire 'ELSE '00'' con' ELSE pvc' in modo da poter mantenere i valori esistenti nella colonna 'pvc', altrimenti sono graffiati con' 00 '(caso' pvc IS NOT NULL'). Molte grazie! – wiltomap