2017-05-30 155 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