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!


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)

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.