2015-01-06 16 views
30

Hier ist ein Auszug aus meinem Tisch:PostgreSQL CASE ... END mit mehreren Bedingungen

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

ich die PVC-Spalte ein SELECT CASE als Gebrüll füllen wollen:

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 ; 

Das Ergebnis ist der gleiche Inhalt wie die Quellentabelle, nichts ist passiert und ich bekomme keine Fehlermeldung in pg_log Dateien. Es könnte sich um einen Syntaxfehler oder ein Problem bei der Verwendung mehrerer Bedingungen in WHEN-Klauseln handeln.

Vielen Dank für Hilfe und Beratung!

+0

Können Sie einen NULL-Wert anzuzeigen, in dem es null ist (so können wir den Unterschied zwischen NULL und leere Zeichenkette sehen)? Wie in, ein String mit 'NULL' zum Beispiel – Paco

+2

Sie haben auch ein Problem mit Klammern. Warum gibt es eine schließende Klammer nach 1980? (an beiden Orten) – Paco

Antwort

56

vielleicht sollte diese Art von Code für Sie arbeiten

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

Fast perfekt ;-)! Ich würde "ELSE" 00 "einfach durch" ELSE pvc "ersetzen, so dass ich die vorhandenen Werte in der' pvc'-Spalte behalten kann, ansonsten werden sie mit '00' gekratzt (Fall 'pvc IS NOT NULL'). Danke vielmals! – wiltomap

Verwandte Themen