2017-05-30 157 views
1

我試圖通過REST API修補一個對象。什麼是錯我的查詢......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); 
}); 

我得到的回覆是成功的,但每列設置爲「假」除了我沒有設置用戶名。我沒有任何地方設置tru/false。我嘗試過不同的價值觀等,但我迷路了。請幫助

回答

1

whenelse條款是以值,而不是SQL片段。 first_name = $3,例如,是一個布爾表達式,其可以或者評估爲truefalse,取決於first_name值。相反,你只需要使用的價值你想設置:

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

acutally,這在不正確的。 ELSE first_name END, – MattEm

+0

@MattEm yup,不幸的是,複製錯誤綜合症,感謝您的注意。編輯並修復。 – Mureinik

1

你在做什麼是在一種情況下使用first_name = $3表達式的結果,在另一種情況下使用first_name = first_name的結果。兩者都是布爾型的。

你想寫什麼可能是:

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

同上,用於last_name