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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top