1

ユーザーが、そのユーザーの情報を含む行に入る必要があるさまざまなデータを提供する場合と提供しない場合があります。問題は、時間の経過とともに行に複数のエントリを作成する必要があることです。過去に設定されていた場合、既存の値を無効にしたくありません。

私の望みは、(疑似コードで) 次のようなことをすることです:

var a,b,c;// これらはユーザーが提供する値で、いつでも null になる可能性があります

update user if a != null set name = a,  if b != null set phone = b, if c != null set email c

この方法で動作するように IF を作成しようとしましたが、試したさまざまな方法で構文エラーが発生します。誰かがこれを行う正しい方法に光を当てることができることを願っています(可能であれば)。

ティア

4

3 に答える 3

2

これを行う 1 つの方法は、 COALESCE()を使用して各列を元の値に「デフォルト」することです。

UPDATE user
SET name = COALESCE(a, name),
    phone = COALESCE(b, phone),
    email = COALESCE(c, email)
WHERE ...

COALESCE() は最初の非 null 引数を返すため、aが null の場合は の元の値を返すだけnameなので、正味の変更はありません。

MySQL は、COALESCE() のように機能する関数 ISNULL() もサポートしていますが、COALESCE() は標準 SQL です。また、COALESCE() は 3 つ以上の引数をサポートします。

于 2013-01-01T23:54:34.367 に答える
2

COALESCE次のように使用できます。

UPDATE user SET name = coalesce(a, name), ...

おそらくより良いアプローチは、UPDATE ステートメントを動的に作成し、更新が必要なフィールドのみを含めることです。

于 2013-01-01T23:55:14.287 に答える
1

純粋にSQLで行う方法は次のとおりです。

UPDATE user
SET name = IF(a IS NULL, name, a),
    phone = IF(b IS NULL, phone, b),
    email = IF(c IS NULL, email, c)
于 2013-01-01T23:54:18.880 に答える