web-dev-qa-db-ja.com

IF NOT NULLの場合はUPDATE、それ以外の場合はフィールドの値を保持

どういうわけかそれを機能させるのに近いと思いますが、何らかの理由でまだエラーが発生します。

次のUPDATEクエリがあります。

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories' THEN @Accessories
          WHEN 'Description' THEN @Description
          WHEN 'Specification' THEN @Specification
          ELSE Details
END
WHERE DeviceID = 10

パラメータは、さまざまなユーザーによって入力されます。私が今直面している問題は、単一のフィールドを更新したい場合でも、他のパラメーターを古いデータで埋めなければならないということです。したがって、オプションIF @parameter IS NULL THENを保持してから、DBにすでに格納されている値を保持します。解決策を見つけようとしたところ、次のクエリのようなものが解決策が動作しません。

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories' IS NOT NULL THEN @Accessories
          WHEN 'Description' IS NOT NULL THEN @Description
          WHEN 'Specification' IS NOT NULL THEN @Specification
          ELSE Details
END
WHERE DeviceID = 10

DBはSQL Server 2008に格納されています

助けてくれてありがとう。

明確にするための編集:

元のテーブルはこんな感じ

DeviceID|Name         |Details   |
     10 |Accessories  |earplugs  |
     10 |Description  |protectors|
     10 |Specification|BeatsByDre|

公開上の理由で、テーブルをオンにするクエリを作成しました。したがって、選択クエリが実行されると、返されるテーブルは次のようになります。

DeviceID|Accessories|Description|Specification|
     10 |earplugs   |protectors |BeatsByDre   |

システムユーザーがアクセサリ、説明、仕様などのさまざまなフィールドを更新できるUIを作成しました。上部に表示されているクエリですべてのフィールドを更新すると、更新が機能します。ただし、テキストボックスを空のままにすると、@ parameterに値がないというエラーが表示されます。したがって、何かが書かれているフィールドのみを更新するソリューションを見つけようとしています。 @parameter IS NULLの場合、DBに元の値を保持します。必要なものに非常に近いが、機能させることができない別の解決策を見つけました。ここに他の解決策があります: https://stackoverflow.com/questions/9387839/mysql-if-not-null-then-display-1-else-display-

10
Greenhorn

これで問題は解決すると思います:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories'   THEN COALESCE(@Accessories, Details)
          WHEN 'Description'   THEN COALESCE(@Description, Details)
          WHEN 'Specification' THEN COALESCE(@Specification, Details)
          ELSE Details
              END
WHERE DeviceID = 10 ;

またはこれ(冗長な更新を避けるため):

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories'   THEN @Accessories
          WHEN 'Description'   THEN @Description
          WHEN 'Specification' THEN @Specification
          ELSE Details
              END
WHERE DeviceID = 10 
  AND ( Name = 'Accessories'   AND @Accessories IS NOT NULL
     OR Name = 'Description'   AND @Description IS NOT NULL
     OR Name = 'Specification' AND @Specification IS NOT NULL
      ) ;

またはこれ、テーブル値コンストラクタを使用します:

UPDATE da
SET da.Details = upd.Details
FROM DeviceAttribute AS da
  JOIN
    ( VALUES
      ('Accessories'   , @Accessories),
      ('Description'   , @Description),
      ('Specification' , @Specification)
    ) AS upd (Name, Details)
    ON upd.Name = da.Name 
WHERE da.DeviceID = 10
  AND upd.Details IS NOT NULL ;
13
ypercubeᵀᴹ