2013-08-19 60 views
0

我想用REGEXP_SUBSTR更新表中的一列,我收到錯誤,缺少表達式。REGEXP_SUBSTR更新表

UPDATE p_table SET f_name = SELECT REGEXP_SUBSTR ((SELECT user_name 
          FROM user_info 
         WHERE ROWID = R_ID ('user_info')), '[^ ]{1,15}', 1, 1) 
      FROM DUAL; 

當我在第一個選擇之前和第二個選擇之後添加圓括號時,它將工作,但將該列中的所有行設置爲相同的值。我不需要他們都是獨一無二的,但我不能讓他們都一樣。感謝您提供給我的任何建議。

UPDATE p_table SET f_name = (SELECT REGEXP_SUBSTR ((SELECT user_name 
          FROM user_info 
         WHERE ROWID = R_ID ('user_info')), '[^ ]{1,15}', 1, 1) 
      FROM DUAL); 
+1

這是在第二行最後一行的「1」之後的「,」。它期望別的可以遵循... –

+1

你的表情似乎缺少了一點,但我想這是在你複製時丟失的。您的子查詢似乎與您正在更新的表格不相關;子查詢將生成一個單一的值(我認爲),所以所有的行將被設置爲相同的值。你想如何生成值 - 兩個表之間的聯繫是什麼? –

+0

感謝您的支持。我更新了上面的陳述。 – user2697655

回答

0

它是否做你想要的沒有子查詢?

UPDATE p_table 
    SET f_name = (SELECT REGEXP_SUBSTR(user_name, '[^ ]{1,15}', 1, 1) 
        FROM user_info 
        WHERE ROWID = R_ID ('user_info') 
       ); 
+0

不,它只更新具有相同值的所有行。我需要的行大多不同。謝謝你的幫助。 – user2697655

2

正如@PatrickMarchand所述,Oracle優化了查詢,所以你的函數只需要調用一次。 AskTom article說得很清楚。

爲了讓你必須引進一些鏈接到p_table行插入函數的參數,迫使甲骨文稱其爲每行一個解決方法。 例如rowidp_table

UPDATE p_table 
SET f_name = (
     SELECT 
     REGEXP_SUBSTR( 
      (SELECT user_name FROM user_info 
      WHERE ROWID = R_ID ('user_info', p_table.rowid) 
     ), 
      '[^ ]{1,15}', 1, 1 
     ) 
     FROM DUAL 
    ) 

SQLFiddle example

+0

感謝您的幫助。 SQLFiddle和AskTom有很多幫助。 – user2697655