SQL语句 - 根据某些条件将多个列更新为不同的值

时间:2014-10-28 21:24:24

标签: sql sql-server sql-server-2008

我有下表

MyTable

id  | name | phone  | status1 | status2 | finalStatus
------------------------------------------------------
001 | Jack | 123456 |  good   |  good   |   X
002 | Jack | 123456 |  bad    |  good   |   X
003 | Jack | 123456 |  bad    |  bad    |   X
004 | Other| 000000 |  good   |  good   |   X

鉴于[name][phone],如果[status1][status2]合适,则将[finalStatus]更新为好。否则,将其他人更新为坏。

因此,给定Name=jackphone=123456,我想要的结果表应如下所示

id  | name | phone  | status1 | status2 | finalStatus
-----------------------------------------------------
001 | Jack | 123456 |  good   |  good   |   good   
002 | Jack | 123456 |  bad    |  good   |   bad
003 | Jack | 123456 |  bad    |  bad    |   bad
004 | Other| 000000 |  good   |  good   |   X

我做了一些研究,发现我可以在声明时使用案例来做。我尝试了以下代码,但它不起作用。

UPDATE [myTable]
SET finalStatus = (CASE
                      WHEN (status1 = 'Good' and status2 = 'Good')
                      THEN 'Good'
                      ELSE 'Bad'
                   END)
WHERE name = 'Jack' and phone = '123456'

更新

我的意思是"不起作用"上面是该行没有真正更新。但是,我只是弄清楚为什么它对我不起作用。这是非常愚蠢的,因为我使用了错误的表名(名称非常相似)。

但是,我尝试了以下代码

UPDATE [myTable]
SET finalStatus = (CASE
                      WHEN (status1 = 'Good' and status2 = 'Good' and name = 'Jack' and phone = '123456')
                      THEN 'Good'
                      ELSE 'Bad'
                   END)

上表中的第一行设置为' Good',这是正确的。但是,所有其他行都设置为坏。上面的代码有什么问题?我认为它与上面的第一个代码相同。

提前致谢。

1 个答案:

答案 0 :(得分:0)

Try this

DECLARE @Mytable TABLE
  (
     id          INT,
     name        VARCHAR(20),
     phone       INT,
     status1     VARCHAR(10),
     status2     VARCHAR(10),
     finalStatus VARCHAR(10)
  )

INSERT INTO @Mytable
VALUES     ('001',
            'Jack',
            '123456',
            'good',
            'good',
            'X'),
            ('002',
             'Jack',
             '123456',
             'bad',
             'good',
             'X'),
            ('003',
             'Jack',
             '123456',
             'bad',
             'bad',
             'X'),
            ('004',
             'Other',
             '000000',
             'good',
             'good',
             'X')

SELECT *
FROM   @Mytable

UPDATE @Mytable
SET    finalStatus = ( CASE
                         WHEN status1 = 'good'
                              AND status2 = 'good' THEN 'good'
                         ELSE 'bad'
                       END )
WHERE  name = 'jack'
       AND phone = '123456'

SELECT *
FROM   @Mytable