복붙노트

[SQL] 나는 SQL Server 2005의 일부 레코드를 업데이트 CASE 문을 사용하려면

SQL

나는 SQL Server 2005의 일부 레코드를 업데이트 CASE 문을 사용하려면

UPDATE dbo.TestStudents  
SET LASTNAME = 
( CASE  
WHEN (LASTNAME = 'AAA') THEN 'BBB' 
WHEN (LASTNAME = 'CCC') THEN 'DDD' 
WHEN (LASTNAME = 'EEE') THEN 'FFF' 
ELSE  (LASTNAME)
END )

목적하지만 테이블의 모든 레코드를 통해 다른 조건 검사에 대한 문 작동합니다. 있는 그대로 내가 영향을받지 행을 떠날 수있는 방법이 있나요?

해결법

  1. ==============================

    1.WHERE 절을 추가

    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')
    
  2. ==============================

    2.이것은 또한 대소 때의 대체 사용하는 것입니다 ...

    이것은 또한 대소 때의 대체 사용하는 것입니다 ...

    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)
    

    중복 값이 ​​허용되지 않습니다 및 업데이트를 만들 수 있습니다 어디 경우에 임시 테이블의 사용을 좋아한다. 예를 들면 :

    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)
    
  3. ==============================

    3.그런 다음, (@J W의 대답에 따라)를 두 번 목록을 반복 테이블 변수의 업데이트를 넣어 사용하지 않을 경우는 UPDATE에 가입 :

    그런 다음, (@J W의 대답에 따라)를 두 번 목록을 반복 테이블 변수의 업데이트를 넣어 사용하지 않을 경우는 UPDATE에 가입 :

    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
    
  4. from https://stackoverflow.com/questions/15766102/i-want-to-use-case-statement-to-update-some-records-in-sql-server-2005 by cc-by-sa and MIT license