Oracle:通过添加现有值来更新数据行

时间:2014-10-16 13:35:49

标签: sql oracle sql-update

我的数据库(Oracle 11g)中有一个大表,我想要更新表中有特定数字的列。 我想通过设置此列的每个值的prefix来更新它。

示例(SpecificNumber为int,PK,Value1为Varchar2,因此是最后一列):

实际数据:

    [SpecificNumber] [Value1] [column2gettingupdated]
[1]  123456789        Test     text    
[2]  123456789102     sth      text2    
[3]  12233            text     test3

未来数据(在我的sql之后):

    [SpecificNumber] [Value1] [column2gettingupdated]
[1]  123456789        Test     PREFIX-text    
[2]  123456789102     sth      PREFIX-text2    
[3]  12233            text     PREFIX-test3

所以我想的是:

Update table
set column2gettingupdated=("prefix"+
    (select column2gettingupdated from table where SpecificNumber = '12233')
)
where SpecificNumber = '12233';

但是这给了我一个ORA-00904: "p": invalid identifier错误。

如果我试试这个:

Update table
set column2gettingupdated=("prefix"+
    (select column2gettingupdated from table where SpecificNumber = '12233')
)
where SpecificNumber = '12233';

我收到ORA-01722: invalid number错误。

这甚至可能吗?已经感谢你的帮助了!

2 个答案:

答案 0 :(得分:10)

所需的只是使用连接运算符||。更新语法不要求您有子查询来获取值{122}的column2gettingupdated

此外,对于Oracle VARCHAR2,您使用单引号而不是双引号。这导致此语句的语法:

UPDATE table
   SET column2gettingupdated = 'prefix' || column2gettingupdated
 WHERE SpecificNumber        = 12233;

以下是示例模式SCOTT的示例:

SCOTT@dev> CREATE TABLE DEPT2 as (
  2          SELECT *
  3            FROM DEPT
  4         );

Table created.

SCOTT@dev> commit;

Commit complete.

SCOTT@dev> UPDATE DEPT2
  2     SET DNAME  = 'PRE '|| DNAME
  3   WHERE DEPTNO = 20;

1 row updated.

SCOTT@dev> commit;

Commit complete.

SCOTT@dev> SELECT *
  2    FROM dept
  3   WHERE deptno = 20
  4   UNION
  5  SELECT *
  6    FROM dept2
  7   WHERE deptno = 20
  8  
SCOTT@dev> /

    DEPTNO DNAME          LOC
========== ============== =============
        20 PRE RESEARCH   DALLAS
        20 RESEARCH       DALLAS

答案 1 :(得分:4)

对字符串使用连接:

update <table_name>
   set column2gettingupdated = 'Prefix-' || column2gettingupdated 
 where specificnumber = 12233; -- use NUMBER literal instead of string one