PostgreSQL - 更新是否存在 'RETURNING ELSE' 语句?

PostgreSQL - Does a 'RETURNING ELSE' statement exist for an UPDATE?

我有这个查询:

update client
set start_date = current_date,
email = '123@fakeemail.com'
where client_id = 1
returning client_id, username, 1 as isSuccess

更新成功后,return如下:

client_id username isSuccess
1 test_name 1

当更新没有执行时,returns client_id、username 和 isSuccess,但它们的值为空。

我遇到的问题是在未执行更新时自定义 returns。如果不执行更新,我需要以下内容 return:

client_id username isSuccess
NULL NULL 0

在不执行update的情况下,用ELSE子句写RETURNING子句,得到上面的结果集有什么技巧吗?或者是否有任何其他方法来获取我需要的结果集?以下代码不起作用 -

 update client
    set start_date = current_date,
    email = '123@fakeemail.com'
    where client_id = 1
    returning client_id, username, 1 as isSuccess
else client_id is null, username is null, 0 as isSuccess

RETURNING 子句中没有 ELSE 语句,但您可以做类似的事情。基本思想是从您的更新中获取结果,使用 UNION 将其与另一行合并,仅 return 第一个结果。

Postgres 不允许我们使用带有 UNION 的更新语句,因此我们必须将更新语句放在 CTE 中:

WITH client_update AS (
  update client
  set start_date = current_date,
  email = '123@fakeemail.com'
  WHERE client_id = 2
  returning client_id, username, 1 as isSuccess, 1 as result_order
)
SELECT client_id, username, isSuccess FROM
  (
    SELECT client_id, username, isSuccess, result_order
    FROM client_update
    UNION ALL
    SELECT null, null, 0, 2
  ) sub 
ORDER BY result_order 
LIMIT 1;

我添加了一个附加列,result_order 这样我们就可以手动指定更喜欢哪个结果。在这种情况下,如果 returning 子句 return 是一个结果,我们想要 return 那个,所以它得到 1.