如何基于另一列的一部分更新列

时间:2016-03-08 13:55:09

标签: sql oracle plsql oracle-sqldeveloper

我需要使用循环或任何其他进程更新同一个表中所有记录的同一个表中另一列的引用更新一个列记录。

示例:

实际:

Column1 Column2                                               
kalyan  kalyan122@gmail.com                     
arun    arun414               
mahesh  ma223ds@gmail.com                 
blog    4anyinfo

预期:

 Column1 Column2                       
 kalyan122  kalyan122@gmail.com                           
 arun414    arun414                            
 ma223ds    ma223ds@gmail.com                              
 4anyinfo   4anyinfo

注意:很少有记录,只有ID存在于第2列。

提前致谢。

4 个答案:

答案 0 :(得分:2)

如果是oracle,你可以这样做:

UPDATE YourTable
SET Column1 = CASE WHEN INSTR(column2, '@')
                   THEN substring(column2,0,INSTR(column2, '@')-1)
                   ELSE column2
              END

答案 1 :(得分:1)

您只需引用SET上的列。

UPDATE myTable
SET
   Column1 = (case when INSTR(Column2,'@') > 0 then SUBSTR(Column2,1,INSTR(Column2,'@')-1) else Column2 end);

它将更新所有行并将column1值设置为column2的值。

您可以添加where子句以指定要更新的行。

答案 2 :(得分:1)

试试这个(假设它是SQL SERVER)

  UPDATE TABLE_A SET Column1=  SUBSTRING(Column2,1,CASE CHARINDEX('@',Column2,1)-1 
  WHEN -1 THEN LEN(Column2) ELSE CHARINDEX('@',Column2,1)-1 END ) 

答案 3 :(得分:1)

这显示了如何提取所需的数据:

SQL> with tbl(col1, col2) as (
      select 'kalyan','kalyan122@gmail.com' from dual union
      select 'arun',  'arun414'             from dual union
      select 'mahesh','ma223ds@gmail.com'   from dual union
      select 'blog',  '4anyinfo'            from dual
    )
    select regexp_replace(col2, '^(.*)@.*$', '\1') col1_data
    from tbl;

COL1_DATA
---------------------------------------------------------------
arun414
4anyinfo
kalyan122
ma223ds

SQL>

首先进行备份以防万一:

create table tbl_bkup as select * from tbl;

然后更新语句将是:

Update tbl
set column1 = regexp_replace(column2, '^(.*)@.*$', '\1');