1

SQL ステートメントの多数のフィールドのいずれかをオプションで更新する方法はありますか? 次のようなところまでしか取得できません。

UPDATE Customer SET 
    ContactName = ?  <=== what to do here if ? is null???
,   CompanyName = ?  <=== what to do here if ? is null???
,   AddressId   = ?  <=== what to do here if ? is null???
,   ...
WHERE CustomerId = ?

ラッパー層と MySQL の制限により、単一のステートメントである必要があります。

明確にするために、リストされたフィールドの 1 つ以上の非 null 値で実行され、値が null でないフィールドのみを更新し、他のフィールドはそのままにする 1 つのステートメントを作成したいと思います。

これは RESTful な更新 API のためのもので、考えられるすべてのフィールドの組み合わせに対して個別のステートメントを必要とせず、API 呼び出し元がレコードのすべてのフィールドを提供することを要求したくありません。将来性があります (フィールドを追加すると、既存の API 呼び出しが中断されます)。これは REST API であるため、マップPOST /customer/xxx?ContactName=...&CompanyName=...してレコードを更新しようとしています。

4

3 に答える 3

1

あなたの目標は完全には明確ではありませんが、合体機能を探していると思います。null 以外の最初の値を返します。

mysql> SELECT COALESCE(NULL,1); -> 1

mysql> SELECT COALESCE(NULL,NULL,NULL); -> ヌル

したがって、値が null の場合に使用する「デフォルト」を設定できます。

UPDATE Customer SET 
    ContactName = COALESCE(?, <Some default>)
...

フィールドを変更したくない場合は、現在の値を使用してください。

UPDATE Customer SET 
    ContactName = COALESCE(?, ContactName)
于 2013-10-04T17:45:11.370 に答える
0
UPDATE Customer SET 
    ContactName = ifnull(?,ContactName)
,   CompanyName = ifnull(?,CompanyName)
,   AddressId   = ifnull(?,AddressId)
WHERE CustomerId = ?

SQL フィドル

于 2013-10-04T17:53:16.737 に答える
0

通常、更新でパラメーターが null の場合は、既存の値を使用する必要があります。

UPDATE Customer SET 
    ContactName = COALESCE(?,ContactName)
于 2013-10-04T17:49:58.270 に答える