2013-08-19 75 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