有没有办法只在null
时更新列,并在一个多列更新查询中不是null
时保留原样?
类似下面的东西。 (就像我们在select语句中使用case的方式一样)
UPDATE users SET users.city = 'Dallas',
CASE
WHEN users.Global_id IS NULL
THEN
users.Global_id = '123'
END WHERE userid = '12312312'
以上更新语句抛出 ORA-00927:缺少等号错误。
为什么我要找这个?
我有一个调度工作,运行类似的查询,如上所述。
并且users
表中还存在一个触发器,如果您尝试更新'not null'global_id
,则会触发错误。所以当我遇到这个触发器时,我的工作就失败了。
我有一个选项...将此更新查询拆分为两个..一个更新城市,一个更新global_id
global_id is null
。
但是想知道这是否可以通过任何其他方式实现......任何想法都会受到赞赏。
答案 0 :(得分:1)
有几个选项,但最接近你的代码的是(重新格式化并删除了冗余内容):
UPDATE users SET
city = 'Dallas',
Global_id =
CASE
WHEN Global_id IS NULL THEN '123'
ELSE Global_id
END
WHERE userid = '12312312';
但是,这相当于coalesce()
函数的更简洁用法:
...
Global_id = COALESCE(Global_id, '123')
...
答案 1 :(得分:0)
您可以使用coalesce功能:
UPDATE users
SET
users.city = 'Dallas',
users.Global_id = coalesce( users.Global_id, '123')
此外,您可以将更新分成两个句子,请记住,而不是将其包含在一个交易中:
UPDATE users
SET
users.city = 'Dallas';
UPDATE users
SET
users.Global_id = '123'
WHERE
users.Global_id is null