PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 06/07/2020 10:28:20

databaser
Membre

Requête avec deux conditions

Bonjour,

J'aimerais remplir une colonne en fonction d'une autre colonne. Il y a deux conditions à intégrer donc je ne peux pas utiliser un WHERE.
Je tente le CASE WHEN mais la variable utilisée pour la condition et la variable pour le résultat sont deux variables différentes. Mon code ne marche pas.

1/ Sauriez-vous quelle instruction utiliser ? Le Case est peut-être inadéquat. Je n'ai rien trouvé dans le tuto de PGS.
2/ Pourquoi mon code ne donne-t-il pas le résultat escompté ?

SELECT Variable1, Variable2
FROM MaTable
WHERE
    (
	CASE WHEN Variable 1 = 'ABC' THEN Variable 2 = 'ABCD'
                 WHEN Variable 1 = 'ABCD' THEN Variable 2 = 'ABC'
                 ELSE NULL			
    END );

Merci big_smile

Hors ligne

#2 06/07/2020 11:35:05

rjuju
Administrateur

Re : Requête avec deux conditions

Bonjour,


Pourriez-vous être un peu plus explicite ?  Il est tout à fait possible d'utiliser deux conditions dans une clause WHERE, et pour le reste je ne suis pas certain de comprendre ce que vous cherchez à faire exactement.

Hors ligne

#3 06/07/2020 12:29:58

databaser
Membre

Re : Requête avec deux conditions

C'est pour éviter d'utiliser deux requêtes distinctes, être un peu plus efficace.
De plus, comme c'est un test, je n'ai pas mis le UPDATE mais l'objectif est de modifier la colonne Variable 2.

UPDATE MaTable SET Variable2 = 'ABCD' WHERE Variable1 = 'ABC';

Utiliser deux conditions dans un WHERE, ça je sais mais le point complexe c'est de modifier la variable2 en fonction du critère de la variable1, c'est-à-dire que Variable1 = ABC, Variable2 devient ABCD, et si Variable 1 = ABCD, Variable2 doit devenir ABC. Merci smile

Hors ligne

#4 06/07/2020 13:48:23

rjuju
Administrateur

Re : Requête avec deux conditions

Pourquoi ne pas utiliser quelquechose comme "update matable set variable2 = case when... end where ..." ?

Hors ligne

#5 06/07/2020 16:14:42

databaser
Membre

Re : Requête avec deux conditions

rjuju a écrit :

Pourquoi ne pas utiliser quelquechose comme "update matable set variable2 = case when... end where ..." ?

Merci @rjuju mais êtes-vous sûr que c'est ça ? A quoi sert WHERE alors que la condition est contenue dans WHEN ? Merci smile

J'ai appliqué votre proposition sans mettre WHERE et les cellules de Variable2 ont comme valeur "true" et non la valeur attendue (ABCD ou ABC)...
Finalement, en mettant cette version, les nouvelles valeurs de Variable2 sont correctes :

UPDATE MaTable SET Variable2 = 
	CASE WHEN Variable1 = 'ABC' THEN  'ABCD'
                 WHEN Variable1 = 'ABCD' THEN  'ABC'
		 ELSE  NULL			
	END;

Merci

Dernière modification par databaser (06/07/2020 16:28:43)

Hors ligne

#6 06/07/2020 16:30:15

rjuju
Administrateur

Re : Requête avec deux conditions

C'est ce que je comprends de votre problème.


La clause WHERE sert à filtrer les lignes, la clause SELECT, ou dans ce cas SET sert à sélectionner ou calculer une valeur.


Pour le reste, impossible de vous aider sans savoir les données en entrées ni ce que vous avez fait.  Pouvez-vous nous montrer un exemple entier, avec structure de la table et données ?

Hors ligne

#7 06/07/2020 22:04:35

gleu
Administrateur

Re : Requête avec deux conditions

Ja valide tout ce que vient de dire rjuju et j'ajouterais que vous ne pouvez pas avoir la valeur true dans Variable2 vu que tout ce qui sort du case est dans ce cas une chaîne, et non pas un booléen. Le petit test ci-dessous le montre facilement :

postgres=# create table matable (variable1 text, variable2 text);
CREATE TABLE
postgres=# insert into matable(variable1) values ('A'), ('AB'), ('ABC'), ('ABCD');
INSERT 0 4
postgres=# UPDATE MaTable SET Variable2 = 
postgres-# CASE WHEN Variable1 = 'ABC' THEN  'ABCD'
postgres-#                  WHEN Variable1 = 'ABCD' THEN  'ABC'
postgres-#  ELSE  NULL
postgres-# END;
UPDATE 4
postgres=# table matable;
┌───────────┬───────────┐
│ variable1 │ variable2 │
├───────────┼───────────┤
│ A         │           │
│ AB        │           │
│ ABC       │ ABCD      │
│ ABCD      │ ABC       │
└───────────┴───────────┘
(4 rows)

Guillaume.

Hors ligne

Pied de page des forums