2011-12-15 75 views
1

表1的值具有追加字符串VARCHAR2字段基于另一字段

col1 varchar2(85) 
col2 date 

有大量的字符可用空间在COL1。如果col2的值在2001之前,则需要追加col1中的任何值OLD到任何可能在col1中的值的前端。

在某些情况下,col1将为NULL。最多只能有小于40个字符的值。

是否有一条SQL语句可以在不进入PL/SQL的情况下完成此操作?

感谢任何和所有的帮助。

回答

0

这也将只在一个SQL语句的工作,因为它会更新所有行的值小于2001 ...

update TAB1 set col1='OLD ' || nvl(COL1, '') where to_char(COL2, 'yyyy') < 2001; 
2

像下面这样的东西应该工作:

select case when to_char(COL2, 'yyyy') < 2001 
      then 'OLD ' || nvl(COL1, '') 
      else COL1 end case 
from TAB1 

例如:

insert into TAB1 values ('testpost2001', trunc(sysdate)); 

insert into TAB1 values ('testpre2001', '01/Jul/2000'); 

insert into TAB1 values (null, trunc(sysdate)); 

insert into TAB1 values (null, '01/Jul/2000'); 

select COL1, COL2, 
     case when to_char(COL2, 'yyyy') < 2001 
     then 'OLD ' || nvl(COL1, '') 
     else COL1 end case 
from TAB1; 

返回:

COL1   COL2   CASE 
testpost2001 15/12/2011 testpost2001 
testpre2001 1/07/2000  OLD testpre2001 
       15/12/2011  
       1/07/2000 OLD 
+1

你可能会考虑使用`case when when_char(col2,'yyyy')<'2001'then'OLD'end || col1结束“,以便只有一次对”col“的明确引用。 – 2011-12-15 05:11:39

+1

不确定是否需要to_char COL2,将日期与日期进行比较会更有效。 `col2 2011-12-15 09:04:35

相关问题