2017-05-30 11 views
1

私はオブジェクトをREST API経由でPATCHしようとしています。何かがCASE文Postgres

// query 
var query = "UPDATE users SET \ 
      first_name = CASE WHEN $3 != '' THEN first_name = $3 ELSE first_name = first_name END, \ 
last_name = CASE WHEN $4 != '' THEN last_name = $4 ELSE last_name = last_name END, \ 
date_updated = now()\ 
WHERE username = $1" 

// params 
var params = [ 
    request.params.user_id, 
    request.body.first_name || '', 
    request.body.last_name || '' 
]; 

// query runs 
sharedPgClient.query(query,params,function(err, res){ 
    callback(err, res); 
}); 

私は何を取り戻すことは成功である...私のクエリが間違っているが、すべての列が、私は設定していないユーザ名を除いて「偽」に設定されています。私はanythignをtrue/falseに設定しません。私はさまざまな価値などで試してみましたが、私は迷っています。助けてください

答えて

1

whenおよびelse句にはSQLフラグメントではなく値が使用されます。 first_name = $3は、たとえば、first_nameの値に応じて、trueまたはfalseと評価されるブール表現です。代わりに、設定しようとしている値を使用する必要があります。

var query = "UPDATE users SET \ 
      first_name = CASE WHEN $3 != '' THEN $3 ELSE first_name END, \ 
      // Here -----------------------------^ 
      last_name = CASE WHEN $4 != '' THEN $4 ELSE last_name END, \ 
      // And here ------------------------^ 
      date_updated = now()\ 
      WHERE username = $1" 
+0

ありがとうございました! – MattEm

+0

これは間違っています。 ELSE first_name END、 – MattEm

+0

@MattEm yup、コピーアンドバグ症候群、残念ながら、気づいていただきありがとうございます。編集され、修正されました。 – Mureinik

1

あなたがやっているのは、あるケースではfirst_name = $3という表現の結果を使用し、もう1つのケースではfirst_name = first_nameの表現を使用しています。どちらもブール値です。あなたが書きたい何

はおそらくです:last_nameため

... SET first_name = CASE WHEN $3 <> '' THEN $3 ELSE first_name END ... 

同上。