0

以下のクエリを使用して、null ではない列の値を更新しようとしています

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' に挿入できません。列はヌルを許可しません。更新は失敗します。

null 値を挿入していませんが、それでもこのエラーが発生します。なぜ私がこれを取得しているのか、誰かが助けてくれますか。

4

3 に答える 3

2

それはかなり厄介なケースステートメントです。私の推測では、あなたはあなたのケースの 1 つと一致していないということです。

それを見ると、同じことを別の方法で達成する方が簡単ではありませんか?

いくつかの例外を除いて、ほとんどすべての更新は部分文字列で行うことができます。

例えば

UPDATE
  BOM
SET 
  CountryCode = SUBSTRING(CountryCode,1,2)
WHERE
  CountryCode IN
(
  'CHF',
  'HKD'
  -- the rest of these go here
)

次に、例外を手動で行います。

この特定の問題に対する答えが得られたのは素晴らしいことですが、私のアドバイスは、パターンを見つけて、自分を苦しめすぎないようにすることです。

于 2011-07-06T15:33:14.470 に答える
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
于 2011-07-06T15:33:40.217 に答える