Clause SQL - WHERE sur chaque commande SET dans UPDATE?
-
07-07-2019 - |
Question
J'essaie de créer une requête SQL en PHP pour mettre à jour une table.
Est-il possible d'avoir une clause WHERE
différente pour chaque ligne affectée?
Par exemple, quelque chose comme:
UPDATE table
SET val=X WHERE someproperty = 1,
SET val=Y WHERE someproperty = 2
etc.?
Toute aide appréciée. Merci
La solution
Vous ne pouvez pas avoir plusieurs clauses WHERE pour une instruction SQL, mais vous pouvez utiliser une instruction CASE pour accomplir ce que vous essayez de faire. Une autre option consiste à exécuter plusieurs instructions UPDATE.
Voici un exemple utilisant l'instruction CASE:
UPDATE table
SET val = (
CASE someproperty
WHEN 1 THEN X
WHEN 2 THEN Y
ELSE val
END
);
Voici un exemple utilisant plusieurs instructions UPDATE:
UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;
Autres conseils
Oui, vous pouvez utiliser une instruction CASE.
UPDATE table
SET val = CASE someproperty
WHEN 1 THEN x
WHEN 2 THEN y
....
ELSE
val
END
Désormais, il est à craindre qu'une instruction CASE
soit moins lisible que plusieurs instructions UPDATE
. Il y a un argument valable ici. Par exemple, lorsque 1 000 lignes sont mises à jour, il est préférable d'utiliser plusieurs instructions UPDATE
plutôt que 1000 conditions différentes pour un seul CASE
.
Cependant, une instruction CASE est parfois plus appropriée. Si, par exemple, vous mettez à jour des lignes en fonction d'un trait, indiquez le caractère pair ou impair de la valeur d'un champ dans la table, une instruction CASE
constitue un moyen merveilleusement concis et facilement maintenable de mettre à jour des lignes dans la liste. table sans avoir à recourir à un grand nombre d'instructions UPDATE
qui partagent toutes un type de logique spécifique. Prenez ceci par exemple:
UPDATE table
SET val = CASE MOD(someproperty, 2)
WHEN 0 THEN x
WHEN 1 THEN y
END
Cette expression prend le module de propriété et, lorsque 0 (pair), attribue la valeur x à val et, lorsque 1 (impair), attribue la valeur y à val. Plus le volume de données mis à jour par cette instruction est important, plus son nettoyage est comparé à celui obtenu par plusieurs instructions UPDATE
.
En bref, les instructions CASE
sont parfois tout aussi lisibles / maintenables que les instructions UPDATE
. Tout dépend de ce que vous essayez de faire avec eux.
MODIFIER : ajout de la clause ELSE pour une sécurité accrue. Le PO peut être intéressé par la mise à jour de lignes spécifiques, le reste doit rester tel qu’il était avant la mise à jour.
MODIFIER : ajout d'un scénario dans lequel l'instruction CASE
constitue une approche plus efficace que plusieurs instructions UPDATE
.
Nope. Faites-en deux mises à jour:
UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;
À la réflexion, vous pouvez utiliser des sous-requêtes ou la déclaration de cas ...
UPDATE table SET val= ( case when someproperty = 1 then X when someproperty = 2 then Y else val END )
Vous devrez peut-être en faire une requête secondaire comme celle-ci:
UPDATE table t1 SET val = ( select CASE when someproperty = 1 then X when someproperty = 2 then Y ELSE val END from table t2 where t1.primarykey = t2.primary key )
UPDATE TABLE
SET VAL CASE SOMEPROPERTY WHEN 1 THEN X WHEN 2 THEN Y END
Un moyen compact et facilement évolutif:
UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '1, 2'), X, Y);
faire la requête de cette façon:
$condition = array(1, 2);
$newvals = array('X', 'Y');
$query = "UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '". implode(',', $condition). "', ". implode(', ', $newvals). ")";
Utilisez prepare_query pour éviter les erreurs de syntaxe SQL si vous traitez avec des valeurs de chaîne.