Dan*_*yCC 5 mysql sql case sql-update
我有这张桌子:
CREATE TABLE IF NOT EXISTS `my_table` (
`A` int(11) NOT NULL,
`B` int(11) NOT NULL,
`C` varchar(50) NOT NULL,
`D` varchar(30) NOT NULL,
PRIMARY KEY (`A`,`B`,`C`)
)
Run Code Online (Sandbox Code Playgroud)
我想在一个查询中更新几个条目.我试过这个:
UPDATE my_table
SET D = CASE
WHEN (A = 6 AND B = 1 AND C = 'red') THEN '1#2#3#5#4'
WHEN (A = 8 AND B = 1 AND C = 'green') THEN '5#6#7#8#9'
END
Run Code Online (Sandbox Code Playgroud)
但是此查询会更新表中的所有条目.它完全更新了我想要更新的两个条目的'D'的值,但它也删除了其他条目的"D"值,我希望它们保留其先前的值.
如果您没有else向case表达式显式添加子句,则它隐式地表现为您已添加else null到该表达式.因此,您的更新语句实际上等效于:
UPDATE my_table
SET D = CASE
WHEN (A = 6 AND B = 1 AND C = 'red') THEN '1#2#3#5#4'
WHEN (A = 8 AND B = 1 AND C = 'green') THEN '5#6#7#8#9'
ELSE NULL
END
Run Code Online (Sandbox Code Playgroud)
这解释了为什么你看到D被"删除".
解决它的一种方法是显式添加一个else简单返回的子句D:
UPDATE my_table
SET D = CASE
WHEN (A = 6 AND B = 1 AND C = 'red') THEN '1#2#3#5#4'
WHEN (A = 8 AND B = 1 AND C = 'green') THEN '5#6#7#8#9'
ELSE D
END
Run Code Online (Sandbox Code Playgroud)
另一种方法,在语法上有点"笨拙",但可能表现稍好,是添加一个where子句,只更新相关的行:
UPDATE my_table
SET D = CASE
WHEN (A = 6 AND B = 1 AND C = 'red') THEN '1#2#3#5#4'
WHEN (A = 8 AND B = 1 AND C = 'green') THEN '5#6#7#8#9'
END
WHERE (A = 6 AND B = 1 AND C = 'red') OR (A = 8 AND B = 1 AND C = 'green')
Run Code Online (Sandbox Code Playgroud)