【问题标题】:append string to varchar2 field based on the value of another field根据另一个字段的值将字符串附加到 varchar2 字段
【发布时间】:2011-12-15 00:58:01
【问题描述】:

表1有

col1 varchar2(85) 
col2 date

col1 中有大量可用的字符空间。如果 col2 值早于 2001,则需要将值 OLD 附加到 col1 中的任何值到 col1 中可能存在的任何值的前端。

在某些情况下,col1 将为 NULL。它的值最多不超过 40 个字符。

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

感谢所有帮助。

【问题讨论】:

    标签: oracle oracle11g


    【解决方案1】:

    类似下面的东西应该可以工作:

    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') &lt; '2001' then 'OLD' end || col1 end,以便仅对col 进行一次显式引用。
    • 不确定是否需要 to_char COL2,将日期与日期进行比较会更有效,例如`col2
    【解决方案2】:

    这也只适用于一条 SQL 语句,因为它将更新所有值小于 2001 的行...

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

    【讨论】:

    • 如果不进一步了解数据库,我认为这不是一个好建议。您可能会破坏正在运行的系统。另外:如果 col1 前面带有“OLD”,则对于某些值,这可能会超过 85 个字符。
    猜你喜欢
    • 1970-01-01
    • 2014-03-26
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多