2012-11-19 57 views
0

有没有办法只在它是null时更新一列,并且当它不是null时保留在一个多列更新查询中? 像下面的东西。 (就像我们如何使用select语句的情况下)更新列只有当它为空时否则不更新

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

猜我可以做到这一点。如果global_id为空然后(更新用户设置users.city ='达拉斯'和users.global_id ='123')其他(更新用户设置users.city ='达拉斯')任何其他想法是值得欢迎的。 – Jeevan

回答

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 
+0

不能使用coalesce,但我打算按照你所说的拆分查询 – Jeevan

+0

coalesce会发生什么情况? – danihp

+0

正如我在我的问题中提到的那样,如果global_id不为空,会有一个防止更新global_id的触发器。它会在更新查询 – Jeevan

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') 
... 
+0

不能使用两者,因为触发器会抛出错误 – Jeevan

+0

@Jeevan你在说什么?我想说如果你愿意的话,你可以用'COALESCE'来代替'CASE'。 – Bohemian

+0

正如我在我的问题中所提到的,如果global_id不为空,会有一个防止更新global_id的触发器。因此,您提到的上述两种方法都会引发错误。 – Jeevan

0

比方说您有此列名不更新city

(UPDATE users SET city = 'Dallas' WHERE Global_id = your_variable_of_user 
           AND city = "") // it means it null here. 

全局ID

的第二个SQL
(UPDATE users SET city = 'Dallas' WHERE Global_id = 0 
           AND city = "") // it means it null here. 
  • user_id是您的用户标识的列名你用
  • 你的意思是global_id会被更新吗?因为如果global_id是0,这意味着它的guest没有登录,所以你将如何更新它? 但我建议你使用PDO。 希望它可以帮助你
相关问题