PostgreSQL CASE… END avec plusieurs conditions

97

Voici un extrait de mon tableau:

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

Je veux remplir la colonne PVC en utilisant un SELECT CASEcomme ci-dessous:

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 ;

Le résultat est le même contenu que la table source, rien ne s'est passé et je n'obtiens aucun message d'erreur dans les fichiers pg_log. Cela peut être une erreur de syntaxe ou un problème d'utilisation de plusieurs conditions dans les clauses WHEN?

Merci pour l'aide et les conseils!

wiltomap
la source
Pouvez-vous afficher une valeur NULL là où elle est nulle (afin que nous puissions voir la différence entre NULL et une chaîne vide)? Comme dans, une chaîne contenant NULLpar exemple
Paco
2
Vous avez également un problème avec les crochets. Pourquoi y a-t-il une parenthèse fermante après 1980? (aux deux endroits)
Paco

Réponses:

156

Ce type de code devrait peut-être fonctionner pour vous

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
la source
2
Presque parfait ;-)! Je voudrais simplement remplacer ELSE '00'par ELSE pvcpour que je puisse garder les valeurs existantes dans la pvccolonne, sinon elles sont rayées avec «00» (cas pvc IS NOT NULL). Merci beaucoup!
wiltomap
Puis-je sauter ELSE?
Zon
L'ELSE est facultatif. Sans ELSE, l'expression retournera NULL lorsqu'aucune des dix clauses WHEN ne correspond.
Klaws