web-dev-qa-db-fra.com

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 du tout. Je souhaite 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, essayé certaines choses et je suis incapable de trouver une solution. Je pense que ce n'est pas possible, mais je pensais que je demanderais ici et voir si quelqu'un l'a déjà fait. Merci d'avance.

89
pqsk

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

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

Ceci est sémantiquement identique, mais n'oubliez pas que les deux colonnes seront toujours mises à jour. Ceci probablement ne vous causera aucun problème, mais si vous avez un volume transactionnel élevé, cela pourrait entraîner des problèmes de simultanéité.

La seule façon de faire spécifiquement ce que vous demandez est d'utiliser du SQL dynamique. C’est cependant quelque chose que je vous encourage à éviter. La solution ci-dessus sera presque certainement suffisante pour ce que vous recherchez.

163
Adam Robinson
UPDATE  table
SET     columnx = CASE WHEN condition THEN 25 ELSE columnx END,
        columny = CASE WHEN condition THEN columny ELSE 25 END
22
Quassnoi

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;

Cordialement

enter image description here

Je souhaite modifier ou mettre à jour mon numéro de contact au 8018070999 dans lequel 8018070777 utilise l'instruction Case

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

enter image description here

1
Debendra Dash

Je sais que c'est une très vieille question et le problème est marqué comme résolu. Cependant, si quelqu'un avec un cas comme le mien où la table a un déclencheur pour la journalisation des données sur les événements de mise à jour, cela posera problème. Les deux colonnes recevront la mise à jour et le journal fera des entrées inutiles. Comme je l'ai fait

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

Maintenant, cela présente un autre avantage: il n’a pas d’écritures inutiles comme les solutions ci-dessus.

1
Harsh