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

SQL语句-根据某些条件将多个列更新为不同的值,sql,sql-server,sql-server-2008,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 | ba

我有下表

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=jack
phone=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

我做了一些研究,发现我可以用case-when语句来做这件事。我已经尝试了以下代码,但它不起作用

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
(小写)并且您正在检查
good
(大写
G
)这一事实可能会导致问题。。。。如果您检查
何时(status1='good'和status2='good')
-这会改变什么吗?它是否适用于这些检查??“我尝试了以下代码,但它不起作用”,你能解释一下“不起作用”在这里的意思吗?它与以前不同。在您只更新
name='Jack'和phone='123456'
的行之前,现在您更改了过滤器和
CASE
表达式,因此现在查找表中的每一行,如果它不是
Good,Good,Jack,123456
,那么最后的状态是
Bad
,那到底是什么happened@Lamak你说得太对了。。现在我明白了……如果你能把这篇文章改成评论,我会接受你的回答。
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