【问题标题】:CASE Statement PostgresCASE 声明 Postgres
【发布时间】:2017-06-01 16:06:39
【问题描述】:

我正在尝试通过 REST API 修补对象。我的查询有问题...

// 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);
});

我得到的是成功,但是除了我没有设置的用户名之外,每一列都设置为“false”。我没有将任何地方设置为 tru / false。我尝试过不同的值等,但我迷路了。请帮忙

【问题讨论】:

    标签: postgresql node-postgres


    【解决方案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"
    

    【讨论】:

    • @MattEm 是的,复制和错误综合症,不幸的是,感谢您的关注。已编辑和修复。
    【解决方案2】:

    您正在做的是在一种情况下使用first_name = $3 表达式的结果,在另一种情况下使用first_name = first_name。两者都是布尔值。

    你想写的大概是:

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

    last_name 同上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-27
      • 2015-10-06
      • 1970-01-01
      • 2011-04-15
      • 2015-08-02
      • 1970-01-01
      • 2018-11-18
      • 2020-12-01
      相关资源
      最近更新 更多