我想使用CASE语句来更新sql server 2005中的一些logging
UPDATE dbo.TestStudents SET LASTNAME = ( CASE WHEN (LASTNAME = 'AAA') THEN 'BBB' WHEN (LASTNAME = 'CCC') THEN 'DDD' WHEN (LASTNAME = 'EEE') THEN 'FFF' ELSE (LASTNAME) END )
该声明是为了这个目的而工作的,但其他条件扫描了表中的每个logging。 有什么办法可以让未受影响的行保持原样吗?
添加一个WHERE
子句
UPDATE dbo.TestStudents SET LASTNAME = CASE WHEN LASTNAME = 'AAA' THEN 'BBB' WHEN LASTNAME = 'CCC' THEN 'DDD' WHEN LASTNAME = 'EEE' THEN 'FFF' ELSE LASTNAME END WHERE LASTNAME IN ('AAA', 'CCC', 'EEE')
这也是案件的替代使用 – 当…
UPDATE [dbo].[JobTemplates] SET [CycleId] = CASE [Id] WHEN 1376 THEN 44 --ACE1 FX1 WHEN 1385 THEN 44 --ACE1 FX2 WHEN 1574 THEN 43 --ACE1 ELEM1 WHEN 1576 THEN 43 --ACE1 ELEM2 WHEN 1581 THEN 41 --ACE1 FS1 WHEN 1585 THEN 42 --ACE1 HS1 WHEN 1588 THEN 43 --ACE1 RS1 WHEN 1589 THEN 44 --ACE1 RM1 WHEN 1590 THEN 43 --ACE1 ELEM3 WHEN 1591 THEN 43 --ACE1 ELEM4 WHEN 1595 THEN 44 --ACE1 SSTn ELSE 0 END WHERE [Id] IN (1376,1385,1574,1576,1581,1585,1588,1589,1590,1591,1595)
我喜欢在不允许重复值的情况下使用临时表,并且您的更新可能会创build它们。 例如:
SELECT [Id] ,[QueueId] ,[BaseDimensionId] ,[ElastomerTypeId] ,CASE [CycleId] WHEN 29 THEN 44 WHEN 30 THEN 43 WHEN 31 THEN 43 WHEN 101 THEN 41 WHEN 102 THEN 43 WHEN 116 THEN 42 WHEN 120 THEN 44 WHEN 127 THEN 44 WHEN 129 THEN 44 ELSE 0 END AS [CycleId] INTO ##ACE1_PQPANominals_1 FROM [dbo].[ProductionQueueProcessAutoclaveNominals] WHERE [QueueId] = 3 ORDER BY [BaseDimensionId], [ElastomerTypeId], [Id]; ---- (403 row(s) affected) UPDATE [dbo].[ProductionQueueProcessAutoclaveNominals] SET [CycleId] = X.[CycleId] FROM [dbo].[ProductionQueueProcessAutoclaveNominals] INNER JOIN ( SELECT MIN([Id]) AS [Id],[QueueId],[BaseDimensionId],[ElastomerTypeId],[CycleId] FROM ##ACE1_PQPANominals_1 GROUP BY [QueueId],[BaseDimensionId],[ElastomerTypeId],[CycleId] ) AS X ON [dbo].[ProductionQueueProcessAutoclaveNominals].[Id] = X.[Id]; ----(375 row(s) affected)
如果你不想重复列表两次(按@JW的答案),然后将更新放在一个表variables中,并使用UPDATE
的JOIN
:
declare @ToDo table (FromName varchar(10), ToName varchar(10)) insert into @ToDo(FromName,ToName) values ('AAA','BBB'), ('CCC','DDD'), ('EEE','FFF') update ts set LastName = ToName from dbo.TestStudents ts inner join @ToDo t on ts.LastName = t.FromName
UPDATE myt SET ENO = CASE WHEN ENO =1 THEN 10 WHEN ENO=0 THEN 100 END FROM MYT