2012-11-19 92 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。 希望它可以幫助你
相關問題