54

私はこのようなクエリを持っています(関数内):

UPDATE some_table SET
  column_1 = param_1,
  column_2 = param_2,
  column_3 = param_3,
  column_4 = param_4,
  column_5 = param_5
WHERE id = some_id;

param_x私の関数のパラメータはどこにありますか。パラメータがである列を更新しない方法はありNULLますか?たとえば、-とがの場合param_4、最初の3列param_5のみを更新し、とNULLの古い値を残します。column_4column_5

私が今それをしている方法は次のとおりです:

SELECT * INTO temp_row FROM some_table WHERE id = some_id;

UPDATE some_table SET
  column_1 = COALESCE(param_1, temp_row.column_1),
  column_2 = COALESCE(param_2, temp_row.column_2),
  column_3 = COALESCE(param_3, temp_row.column_3),
  column_4 = COALESCE(param_4, temp_row.column_4),
  column_5 = COALESCE(param_5, temp_row.column_5)
WHERE id = some_id;

もっと良い方法はありますか?

4

3 に答える 3

105

SELECTステートメントを削除します。必要はありません。現在の値を使用するだけです。

UPDATE some_table SET
  column_1 = COALESCE(param_1, column_1),
  column_2 = COALESCE(param_2, column_2),
  column_3 = COALESCE(param_3, column_3),
  column_4 = COALESCE(param_4, column_4),
  column_5 = COALESCE(param_5, column_5)
WHERE id = some_id;
于 2012-11-09T11:29:10.317 に答える
17

きちんとしたトリック、Przemek、Frank&Erwinに感謝します!

空の更新を避けるために、Erwinの回答を少し編集することをお勧めします。パラメータがnullの場合(「古い値を使用する」という意味)、行の値が変更されていなくても(最初の更新後)、行は毎回更新されました。

「param_xISNOTNULL」を追加することにより、空の更新を回避します。

UPDATE some_table SET
    column_1 = COALESCE(param_1, column_1),
    column_2 = COALESCE(param_2, column_2),
    ...
WHERE id = some_id
AND  (param_1 IS NOT NULL AND param_1 IS DISTINCT FROM column_1 OR
      param_2 IS NOT NULL AND param_2 IS DISTINCT FROM column_2 OR
     ...
 );
于 2012-12-19T00:38:39.920 に答える
15

さらに、空の更新を回避するには:

UPDATE some_table SET
  column_1 = COALESCE(param_1, column_1),
  column_2 = COALESCE(param_2, column_2)
  ...
WHERE id = some_id;
AND  (param_1 IS DISTINCT FROM column_1 OR
      param_2 IS DISTINCT FROM column_2 OR
      ...
     );

これは、ターゲット列が定義されていることを前提としていますNOT NULLそれ以外の場合は、 Geirの拡張バージョンを参照してください。

于 2012-11-09T20:11:05.140 に答える