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.
我有这个查询:
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.