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