PostgreSQL CASE… ENDE mit mehreren Bedingungen

97

Hier ist ein Auszug aus meiner Tabelle:

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

Ich möchte die PVC-Säule mit einem folgenden SELECT CASEBalken füllen :

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 in der Quelltabelle, es ist nichts passiert und ich erhalte keine Fehlermeldung in den pg_log-Dateien. Möglicherweise handelt es sich um einen Syntaxfehler oder um ein Problem bei der Verwendung mehrerer Bedingungen in WHEN-Klauseln.

Vielen Dank für Hilfe und Rat!

wiltomap
quelle
Können Sie einen NULL-Wert anzeigen, bei dem er null ist (damit wir den Unterschied zwischen NULL und leerer Zeichenfolge sehen können)? Wie in, eine Zeichenfolge, die NULLzum Beispiel enthält
Paco
2
Sie haben auch ein Problem mit Klammern. Warum gibt es nach 1980 eine schließende Klammer? (an beiden Orten)
Paco

Antworten:

155

Diese Art von Code sollte vielleicht für Sie funktionieren

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)
Soni Harriz
quelle
2
Fast perfekt ;-)! Ich würde nur ersetzen ELSE '00'mit , ELSE pvcdamit ich die vorhandenen Werte in halten pvcSpalt, da sie sich mit ‚00‘ (Fall verkratzt pvc IS NOT NULL). Vielen Dank!
Wiltomap
Kann ich SONST überspringen?
Zon
Das ELSE ist optional. Ohne ELSE gibt der Ausdruck NULL zurück, wenn keine der zehn WHEN-Klauseln übereinstimmt.
Klaws