我正在尝试使用下面的查询更新非空列的值
update Bom set CountryCode=
case
when CurrencyId='CHF' then 'CH'
when CurrencyId='NZD' then 'NZ'
when CurrencyId='KRW' then 'KR'
when CurrencyId='HKD' then 'HK'
when CurrencyId='MXN' then 'MX'
when CurrencyId='USDe' then 'DE'
when CurrencyId='JPY' then 'JP'
when CurrencyId='EUR' then 'DE'
when CurrencyId='DKK' then 'DK'
when CurrencyId='GBP' then 'GB'
when CurrencyId='AUD' then 'AU'
when CurrencyId='RMB' then 'CN'
when CurrencyId='USDu' then 'US'
when CurrencyId='NOK' then 'NO'
when CurrencyId='CAD' then 'CA'
when CurrencyId='USDm' then 'MX'
when CurrencyId='SEK' then 'SE'
when CurrencyId='SGD' then 'SG'
when CurrencyId='TWD' then 'TW'
when CurrencyId='ZAR' then 'ZA'
end
但出于某种原因我收到错误
无法将值NULL插入 列'CountryCode',表 'Mouser_BOM.dbo.Bom';专栏没有 允许空值。更新失败。
我没有插入任何空值但仍然出现此错误。有人可以帮我解决这个问题。
答案 0 :(得分:5)
在语句末尾添加 ELSE 子句,以捕获所有条件都不匹配的情况。那应该摆脱错误。如下所示:
...
when CurrencyId='SGD' then 'SG'
when CurrencyId='TWD' then 'TW'
when CurrencyId='ZAR' then 'ZA'
else '??'
end
答案 1 :(得分:2)
那是一个相当讨厌的案例陈述。我的猜测是你没有匹配你的一个案例。
看着它,以不同的方式实现同样的事情是不是更容易?
除了少数例外,几乎所有的更新都可以使用子字符串完成。
e.g。
UPDATE
BOM
SET
CountryCode = SUBSTRING(CountryCode,1,2)
WHERE
CountryCode IN
(
'CHF',
'HKD'
-- the rest of these go here
)
然后手动执行例外处理。
虽然你对这个具体问题的答案很酷,但我的建议是发现模式,而不是让自己的生活过于艰难。
答案 2 :(得分:0)
首先,您的案例陈述可以简化。
CASE CurrencyId
WHEN 'CHF' THEN 'CH'
WHEN 'NZD' THEN 'NZ'
WHEN 'KRW' THEN 'KR'
END
其次,必须存在与其中任何一个都不匹配的条件。做一个选择找到它:
SELECT *
FROM Bom
WHERE case CurrencyId
when 'CHF' then 'CH'
when 'NZD' then 'NZ'
when 'KRW' then 'KR'
...
end IS NULL