2017-03-28 5 views
0

J'ai une situation comme celle-ci:Mise à jour d'une table avec des valeurs différentes pour différentes conditions

update lskinproperty 
set frn_lskin_stateid = 2 
where frn_lskinid IN (61209, 61208) 

update lskinproperty 
set frn_lskin_stateid = 3 
where frn_lskinid IN (72670, 56916) 

update lskinproperty 
set frn_lskin_stateid = 4 
where frn_lskinid IN (55451) 

Si je cours ces trois requêtes, il fera ce exactement ce que je veux mais je sens qu'il devrait être mieux façon de le faire. Est-ce que SQL Server a quelque chose comme cas ou commutateur ou quelque chose de similaire où vous pouvez dire pour un cas égal à x faire cela et pour un cas égal à y faire quelque chose d'autre et ainsi de suite?

+0

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql – mallan1121

Répondre

1

Vous pouvez filtrer toutes les valeurs de frn_lskinid en une fois, puis utiliser case pour identifier la valeur à affecter pour frn_lskinid.

update lskinproperty 
set frn_lskin_stateid = case 
     when frn_lskinid in (61209, 61208) 
      then 2 
     when frn_lskinid in (72670, 56916) 
      then 3 
     else 4 
     end 
where frn_lskinid in (72670, 56916, 61209, 61208, 55451) 

Le else ici couvre pour le cas où frn_lskinid est 55451 qui est le même que l'écriture en utilisant explicitement un autre when:

update lskinproperty 
set frn_lskin_stateid = case 
     when frn_lskinid in (61209, 61208) 
      then 2 
     when frn_lskinid in (72670, 56916) 
      then 3 
     when frn_lskinid = 55451 
      then 4 
     end 
where frn_lskinid in (72670, 56916, 61209, 61208, 55451) 
+0

est-ce que la clause else est facultative? – DoArNa

+1

@DoArNa pas ici. Il couvre le cas où frn_lskinid est 55451 – GurV

+1

@DoArNa - Mise à jour de la réponse avec une solution équivalente 'when'. – GurV

1

Il n'y a probablement pas un vrai raccourci pour faire ce type de mise à jour. L'utilisation de case vous oblige à fournir deux fois le id s: une fois dans la clause case et à nouveau dans la clause where. Toutefois, si vous avez les valeurs à changer de manière tableau, alors vous pourriez faire quelque chose comme ce qui suit:

update tbl set frn_lskin_stateid=st 
from (  select 61209 i,2 st 
    union all select 61208,2 
    union all select 72670,3 
    union all select 56916,3 
    union all select 55451,4) tvalues 
inner join lskinproperty tbl on frn_lskinid=i; 

Dans une application réelle tvalues serait très probablement une table avec vos valeurs cibles, mais, bien sûr, vous pouvez également fournir les valeurs dans une sous-requête avec plusieurs lignes union all comme indiqué ci-dessus. Pour une démonstration voir ici: http://rextester.com/NDQGL19748

+0

Quand vous dites "Utiliser le cas vous oblige à fournir les identifiants deux fois", dites-vous que cela prend du temps ou nuit à la performance de la base de données? – DoArNa

+0

@DoArNa: Non, je crois que travailler avec 'case', comme le montre la solution de GurV, est un moyen très efficace. Mais compiler le commandement à la main est un peu lourd et cède la place à des erreurs. D'un autre côté, dans mon approche, vous devrez retaper la valeur cible pour chaque identifiant, ce qui est également un peu répétitif ... – cars10m