web-dev-qa-db-fra.com

SI NON NUL, alors MISE À JOUR, sinon conservez la valeur du champ

Je pense que je suis en quelque sorte proche de le faire fonctionner, mais pour une raison quelconque, je reçois toujours des erreurs.

J'ai la requête UPDATE suivante:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories' THEN @Accessories
          WHEN 'Description' THEN @Description
          WHEN 'Specification' THEN @Specification
          ELSE Details
END
WHERE DeviceID = 10

Les paramètres sont renseignés par différents utilisateurs. Le problème auquel je suis confronté maintenant est que même lorsque vous souhaitez mettre à jour un seul champ, vous devez toujours remplir avec les anciennes données les autres paramètres. Par conséquent, je voudrais définir l'option IF @parameter IS NULL THEN garder la valeur qui est déjà stockée dans la base de données. J'ai essayé de trouver une solution et quelque chose comme la requête suivante semble être le solution mais je ne peux pas le faire fonctionner:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories' IS NOT NULL THEN @Accessories
          WHEN 'Description' IS NOT NULL THEN @Description
          WHEN 'Specification' IS NOT NULL THEN @Specification
          ELSE Details
END
WHERE DeviceID = 10

LA BD est stockée dans SQL Server 2008

Merci d'avance pour l'aide.

EDIT pour clarifier:

La table d'origine ressemble à ceci

DeviceID|Name         |Details   |
     10 |Accessories  |earplugs  |
     10 |Description  |protectors|
     10 |Specification|BeatsByDre|

Pour des raisons de publication, j'ai fait une requête pour renverser la vapeur. Ainsi, lorsque la requête Select est exécutée, la table de retour ressemble à ce qui suit

DeviceID|Accessories|Description|Specification|
     10 |earplugs   |protectors |BeatsByDre   |

J'ai créé une interface utilisateur pour permettre aux utilisateurs du système de mettre à jour les différents champs tels que Accessoires, Description, Spécifications. La mise à jour fonctionne si je mets à jour tous les champs avec la requête affichée en haut. Cependant, lorsque je laisse une zone de texte vide, j'obtiens une erreur indiquant que le @parameter manque une valeur. Donc, essayer de trouver une solution pour mettre à jour uniquement le champ où est écrit quelque chose. Donc, si @parameter IS NULL, conservez la valeur d'origine dans la base de données. J'ai trouvé une autre solution qui est vraiment proche de ce que je veux mais ne peut pas le faire fonctionner. Voici l'autre solution : https://stackoverflow.com/questions/9387839/mysql-if-not-null-then-display-1-else-display-

10
Greenhorn

Je pense que cela résoudra le problème:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories'   THEN COALESCE(@Accessories, Details)
          WHEN 'Description'   THEN COALESCE(@Description, Details)
          WHEN 'Specification' THEN COALESCE(@Specification, Details)
          ELSE Details
              END
WHERE DeviceID = 10 ;

ou ceci (pour éviter les mises à jour redondantes):

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories'   THEN @Accessories
          WHEN 'Description'   THEN @Description
          WHEN 'Specification' THEN @Specification
          ELSE Details
              END
WHERE DeviceID = 10 
  AND ( Name = 'Accessories'   AND @Accessories IS NOT NULL
     OR Name = 'Description'   AND @Description IS NOT NULL
     OR Name = 'Specification' AND @Specification IS NOT NULL
      ) ;

ou ceci, en utilisant un constructeur de valeur de table:

UPDATE da
SET da.Details = upd.Details
FROM DeviceAttribute AS da
  JOIN
    ( VALUES
      ('Accessories'   , @Accessories),
      ('Description'   , @Description),
      ('Specification' , @Specification)
    ) AS upd (Name, Details)
    ON upd.Name = da.Name 
WHERE da.DeviceID = 10
  AND upd.Details IS NOT NULL ;
13
ypercubeᵀᴹ