我正在尝试使用特定信息更新某些选择的行。这意味着我不能做一个简单的更新语句,而是必须指定我想要更改的行以及我将修改它们的值。简而言之,我想更新一个当前为null的日期列与相应的parameterid;因此,以下陈述似乎合乎逻辑:
UPDATE contactparameter
SET effectiveto = CASE parameterid
When '2887' Then '13-Aug-2012'
When '2896' Then '21-Feb-2012'
When '3008' Then '28-Oct-2012'
When '3272' Then '18-Jan-2013'
END
如果我然后更新,那么所有未包含在该列表中的行,即参数id不是'2887','2896','3008'或'3272'的所有行都将被清空。我尝试在子查询中选择要更新的行:
UPDATE contactparameter
SET effectiveto = CASE parameterid
When '2887' Then '13-Aug-2012'
When '2896' Then '21-Feb-2012'
When '3008' Then '28-Oct-2012'
When '3272' Then '18-Jan-2013'
END
WHERE exists
(SELECT cp.parameterid
from contact c
INNER JOIN contactparameter cp on c.serialnumber = cp.serialnumber
WHERE cp.effectivefrom is not null
and cp.effectiveto is null)
但这完全一样。我仍然缺乏使用SQL的经验,我确信我错过了某个关键元素。你能帮忙吗?
答案 0 :(得分:1)
这应该这样做:
UPDATE contactparameter
SET effectiveto = CASE parameterid
When '2887' Then '13-Aug-2012'
When '2896' Then '21-Feb-2012'
When '3008' Then '28-Oct-2012'
When '3272' Then '18-Jan-2013'
END
from contact c
INNER JOIN contactparameter cp on c.serialnumber = cp.serialnumber
WHERE cp.effectivefrom is not null
and cp.effectiveto is null
答案 1 :(得分:1)
两种方法,
#1,在CASE表达式中指定一个ELSE子句,只返回它已经存在的相同值,否则它将为所有不匹配返回NULL:
UPDATE contactparameter
SET effectiveto = CASE parameterid
When '2887' Then '13-Aug-2012'
When '2896' Then '21-Feb-2012'
When '3008' Then '28-Oct-2012'
When '3272' Then '18-Jan-2013'
Else effectiveto
END
或#2,使用WHERE子句仅匹配CASE表达式中也匹配的行:
UPDATE contactparameter
SET effectiveto = CASE parameterid
When '2887' Then '13-Aug-2012'
When '2896' Then '21-Feb-2012'
When '3008' Then '28-Oct-2012'
When '3272' Then '18-Jan-2013'
END
WHERE parameterid IN('2887','2896','3008','3272')
第二个通常更快,并且出于锁定原因首选。