仅当它为null时更新列,否则不更新

时间:2012-11-19 17:43:20

标签: sql oracle

有没有办法只在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

但是想知道这是否可以通过任何其他方式实现......任何想法都会受到赞赏。

2 个答案:

答案 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