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.

0voto

John Greiner Points 37

Je pense que vous pouvez omettre de mettre à jour les colonnes "non souhaitées" en ajustant les autres réponses comme suit :

update table set
    columnx = (case when condition1 then 25 end),
    columny = (case when condition2 then 25 end)`

Si je comprends bien, la mise à jour ne se fera que lorsque la condition sera remplie.

Après avoir lu tous les commentaires, c'est le plus efficace :

Update table set ColumnX = 25 where Condition1
 Update table set ColumnY = 25 where Condition1`

Tableau des échantillons :

CREATE TABLE [dbo].[tblTest](
    [ColX] [int] NULL,
    [ColY] [int] NULL,
    [ColConditional] [bit] NULL,
    [id] [int] IDENTITY(1,1) NOT NULL
) ON [PRIMARY]

Exemples de données :

Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0)
Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0)
Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1)
Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1)
Insert into tblTest (ColX, ColY, ColConditional) values (1, null, null)
Insert into tblTest (ColX, ColY, ColConditional) values (2, null, null)
Insert into tblTest (ColX, ColY, ColConditional) values (null, 1, null)
Insert into tblTest (ColX, ColY, ColConditional) values (null, 2, null)

Maintenant je suppose que vous pouvez écrire une conditionnelle qui gère les nuls. Pour mon exemple, je suppose que vous avez écrit une telle condition qui évalue à True, False ou Null. Si vous avez besoin d'aide à ce sujet, faites-le moi savoir et je ferai de mon mieux.

Maintenant, l'exécution de ces deux lignes de code change effectivement X en 25 si et seulement si ColConditional est True(1) et Y en 25 si et seulement si ColConditional est False(0).

Update tblTest set ColX = 25 where ColConditional = 1
Update tblTest set ColY = 25 where ColConditional = 0

P.S. Le cas nul n'a jamais été mentionné dans la question originale ou dans les mises à jour de la question, mais comme vous pouvez le voir, cette réponse très simple les traite quand même.

1 votes

En fait, ça ne marche pas. D'une part, si la colonne autorise les valeurs nulles, une valeur nulle est attribuée lorsque la condition n'est pas remplie. Dans le cas où les valeurs nulles ne sont pas autorisées, la mise à jour échouera. Votre requête finale "efficace" est un sql invalide, du moins en TSQL. Avez-vous testé cela sur un moteur spécifique et cela a fonctionné pour vous ?

0 votes

J'ai testé ceci sur SQL Server 2005 et cela fonctionne parfaitement comme indiqué. J'aimerais savoir pourquoi il a été rejeté et avoir un exemple montrant que la valeur NULL est mise à jour, car dans mon test ci-dessus, la valeur NULL n'est pas mise à jour. J'ai toujours pensé que la réponse la plus simple est la meilleure et si je traite une base de données avec des millions d'enregistrements, je ne veux certainement pas mettre à jour des lignes inutiles.

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