4

更新する新しい値がない場合は、既存のデータをそのまま残して、2 つの日付でレコードを更新したいと考えています。

サンプル テーブル レコードは次のとおりです。

id  last_foo    last_bar
--  ----------  ----------
 1  2010-05-30  2010-05-30

そして、私が使用しているクエリ:

UPDATE sampledates
   SET last_foo = @LastFoo, 
       last_bar = @LastBar
 WHERE id = @ID;

null 許容の日時 LastFooまたはnull の場合LastBar、既存の SQL 値をそのまま残し、そうでない場合は更新します。

たとえば、このレコードを次の値で更新するとします (これは C# ですが、どの言語も適用されます)。

DateTime? LastFoo = new DateTime('2010-06-04');
DateTime? LastBar = null;

レコードを次のようにしたいと思います。

id  last_foo    last_bar
--  ----------  ----------
 1  2010-06-04  2010-05-30

値が null の場合、クエリ テキストを変更して 2 番目の列を省略することができることに気付きましたが、クエリをそのままにして、指定された列を変更しないことを指定できる方法があるかどうか疑問に思いました。

4

4 に答える 4

9

試す

UPDATE sampledates
SET last_foo = COALESCE(@LastFoo,last_foo ), 
last_bar = COALESCE(@LastBar,last_bar )
WHERE id = @ID;
于 2010-06-04T21:45:43.177 に答える
6

COALESCEを使用できます:

UPDATE sampledates
SET last_foo = COALESCE(@LastFoo, last_foo),
    last_bar = COALESCE(@LastBar, last_bar)
WHERE id = @ID;

SQL Serverでは、COALESCE の代わりにISNULLを使用すると、パフォーマンスがわずかに向上します。

UPDATE sampledates
SET last_foo = ISNULL(@LastFoo, last_foo),
    last_bar = ISNULL(@LastBar, last_bar)
WHERE id = @ID;
于 2010-06-04T21:46:08.717 に答える
2

これを試してください(これはテストされていません。現在、SSMSを利用できません)

UPDATE sampledates
   SET last_foo = CASE WHEN @LastFoo IS NULL THEN last_foo ELSE @LastFoo END, 
       last_bar = CASE WHEN @LastBar IS NULL THEN last_foo ELSE @LastBar END
  WHERE id = @ID;
于 2010-06-04T21:46:53.720 に答える
1

次のようなものを試すことができます

UPDATE sampledates
SET last_foo = (case when @LastFoo IS NULL then last_foo else @LastFoo end), 
last_bar = (case when @LastBar IS NULL then last_bar else @LastBar end)
WHERE id = @ID;
于 2010-06-04T21:48:38.117 に答える