【发布时间】:2011-12-15 00:58:01
【问题描述】:
表1有
col1 varchar2(85)
col2 date
col1 中有大量可用的字符空间。如果 col2 值早于 2001,则需要将值 OLD 附加到 col1 中的任何值到 col1 中可能存在的任何值的前端。
在某些情况下,col1 将为 NULL。它的值最多不超过 40 个字符。
是否有一个 SQL 语句可以在不进入 PL/SQL 的情况下完成此操作?
感谢所有帮助。
【问题讨论】:
表1有
col1 varchar2(85)
col2 date
col1 中有大量可用的字符空间。如果 col2 值早于 2001,则需要将值 OLD 附加到 col1 中的任何值到 col1 中可能存在的任何值的前端。
在某些情况下,col1 将为 NULL。它的值最多不超过 40 个字符。
是否有一个 SQL 语句可以在不进入 PL/SQL 的情况下完成此操作?
感谢所有帮助。
【问题讨论】:
类似下面的东西应该可以工作:
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
【讨论】:
case when to_char(col2, 'yyyy') < '2001' then 'OLD' end || col1 end,以便仅对col 进行一次显式引用。
这也只适用于一条 SQL 语句,因为它将更新所有值小于 2001 的行...
update TAB1 set col1='OLD ' || nvl(COL1, '') where to_char(COL2, 'yyyy') < 2001;
【讨论】: