124 votes

T-SQL : Utilisation d'un CASE dans une instruction UPDATE pour mettre à jour certaines colonnes en fonction d'une condition

Je me demande si cela est possible. Je veux mettre à jour la colonne x si une condition est vraie, sinon la colonne y serait mise à jour.

UPDATE table SET
     (CASE (CONDITION) WHEN TRUE THEN columnx
                       ELSE columny
      END)
= 25

J'ai cherché partout, j'ai essayé certaines choses et je ne trouve pas de solution. Je pense que ce n'est pas possible, mais j'ai pensé demander ici et voir si quelqu'un l'a déjà fait. Merci d'avance.

0 votes

En supposant qu'ils soient tous dans la même table, oui. Vous pouvez toujours l'exécuter dans une transaction, et revenir en arrière en cas d'erreur, pour voir par vous-même.

0 votes

Je ne suis pas sûr de ce que vous voulez dire. J'ai essayé de mettre une condition pour la colonne, mais cela ne fonctionne pas. Cela fonctionne pour une instruction de sélection, mais pas pour une instruction de mise à jour.(select (case (condition) when true then columnx else columny end) from myTable.... la mise à jour ne fonctionne pas, et je vois pourquoi. Il ne semble pas y avoir de moyen de la faire fonctionner.

204voto

Adam Robinson Points 88472

Vous ne pouvez pas utiliser une condition pour modifier la structure de votre requête, mais uniquement les données concernées. Vous pourriez le faire :

update table set
    columnx = (case when condition then 25 else columnx end),
    columny = (case when condition then columny else 25 end)

C'est sémantiquement la même chose, mais gardez à l'esprit que les deux colonnes seront toujours mises à jour . Ce site probablement ne vous causera aucun problème, mais si vous avez un volume transactionnel élevé, cela pourrait causer des problèmes de concurrence.

La seule façon de faire spécifiquement ce que vous demandez est d'utiliser le SQL dynamique. Toutefois, je vous encourage à ne pas vous en servir. La solution ci-dessus sera presque certainement suffisante pour ce que vous recherchez.

0 votes

Je suis d'accord sur le SQL dynamique. Mais mes données seront-elles affectées ? Je veux dire que je ne veux pas qu'elles soient modifiées pour certaines conditions. Donc il va juste réinsérer ce qui est déjà là ? Le nombre d'accès à la base de données n'est peut-être pas si mauvais.

0 votes

@pqsk : Cela ne devrait pas affecter vos données, il devrait juste réinsérer ce qui est déjà là pour n'importe quelle colonne. no censé être affecté.

0 votes

Merci. Je vais faire comme ça. C'est si simple, même un homme des cavernes peut le faire. haha.

26voto

Quassnoi Points 191041
UPDATE  table
SET     columnx = CASE WHEN condition THEN 25 ELSE columnx END,
        columny = CASE WHEN condition THEN columny ELSE 25 END

1 votes

Tu as juste copié la réponse d'Adam, ou ça a été pris ailleurs ? haha. Je viens de le remarquer.

1 votes

@pqsk : Nos réponses étaient espacées de ~1 minute, donc j'imagine que j'ai juste cliqué sur soumettre un peu plus vite ;)

27 votes

@pqsk : oui, j'ai juste copié la réponse d'Adam, 23 quelques secondes avant qu'il ne le poste. Je suis un copieur rapide !

8voto

Je sais que c'est une très vieille question, mais cela a fonctionné pour moi :

UPDATE TABLE SET FIELD1 =
CASE 
WHEN FIELD1 = Condition1 THEN 'Result1'
WHEN FIELD1 = Condition2 THEN 'Result2'
WHEN FIELD1 = Condition3 THEN 'Result3'
END;

Salutations

4voto

Debendra Dash Points 1932

enter image description here

Je veux changer ou mettre à jour mon numéro de contact en 8018070999 alors qu'il existe 8018070777 en utilisant l'instruction Case.

update [Contacts] set contactNo=(case 
when contactNo=8018070777 then 8018070999
else
contactNo
end)

enter image description here

2 votes

Pour cela, pourquoi ne pas utiliser cette requête UPDATE [Contacts] SET contactNo = 8018070999 WHERE contactNo = 8018070777

3voto

Harsh Points 353

Je sais que cette question est très ancienne et que le problème est marqué comme étant résolu. Cependant, si quelqu'un a un cas comme le mien où la table a un déclencheur pour l'enregistrement des données sur les événements de mise à jour, cela causera un problème. Les deux colonnes seront mises à jour et l'enregistrement fera des entrées inutiles. La façon dont j'ai procédé

IF (CONDITION) IS TRUE
BEGIN
    UPDATE table SET columnx = 25
END
ELSE
BEGIN
    UPDATE table SET columny = 25
END

Cette solution présente un autre avantage : elle n'entraîne pas d'écritures inutiles sur la table comme les solutions ci-dessus.

0 votes

C'est un bon point et une bonne alternative ! Je ne travaille plus sur le code original qui a conduit à ce fil de discussion, mais il est toujours bon d'avoir des solutions différentes et je pense que c'est une bonne solution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X