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


10

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

次の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がNULLの場合、元の値をDBに保持します。私が本当に望んでいるものに近いが、それを機能させることができない別の解決策を見つけました。ここに他のソリューションがあります:https : //stackoverflow.com/questions/9387839/mysql-if-not-null-then-display-1-else-display-0


この正確なエラーを提供できますか?SQL-Serverエラーですか、それとも(UI)アプリケーションのエラーですか?UPDATEUIはデータベースにどのようなステートメントを送信しますか?
ypercubeᵀᴹ

それを質問に追加できますか?それは、ステートメントがどのように構成され、どのような引用符が使用されるかに関係している可能性があります。 '@'Accessories私には意味がありません。
ypercubeᵀᴹ

1
UIコードが有効なステートメントを生成していない可能性があります。疑似コードではなく、使用しているコードを表示してエラーを生成します。
ypercubeᵀᴹ

もう一度助けてくれてありがとう。私の経験不足のため申し訳ありません。私はなんとかエラーを見つけました、そしてあなたは正しかった問題はUIレベルでした。どうもありがとうございました。誰かが同様の答えを探している場合、私は最初の解決策を使用しました
Greenhorn

回答:


13

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

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 ;

素早い回答ありがとうございます。試して、結果をお知らせします。
Greenhorn 2013年

あなたは私の答えの2番目の解決策を意味しますか?
ypercubeᵀᴹ

はい、私は3番目の解決策を試しています。それは多くの可能性を与えるので、私は答えを賛成しました。私は3番目をタイし、それが機能するようになれば、それも受け入れます。
Greenhorn 2013年

すべて動作するはずです。そうでない場合は、質問を編集して、テーブル構造(Create Tableステートメント)とストアドプロシージャを追加できます。私が誤解している、またはあなたが言及しなかった関連性があるかもしれません。
ypercubeᵀᴹ

これらの回答がすべてのパラメーターがnullでない場合は機能するが、それらのいずれかがnullの場合は機能しない場合は、UIコードを調べ、クエリの生成時にnullをどのように処理するかを確認します。そして、質問にその(UI)コードを追加できます。
ypercubeᵀᴹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.