oracle字符串操作

前情提要


order 表中有两个字段记录了年份(西历年份,日本年份)=>(201607201708,平成28年(2016年)7月~平成29年(2017年)8月) 类似于这种数据,现在客户希望把日本年份这个字段中的数据改成 2016年7月~2017年8月 这种格式的,本来已经用PHP 解决了,但是客户希望我们提供一条SQL实现这种效果。
以下是修改sql:

UPDATE ORDER
SET    INS_NENSHIKI = Substr(INS_NENSHIKI_NO, 1, 4)
                      || '年'
                      || To_number(Substr(INS_NENSHIKI_NO, 5, 2))
                      || '月~'
                      || Substr(INS_NENSHIKI_NO, 7, 4)
                      || '年'
                      || To_number(Substr (INS_NENSHIKI_NO, 11, 2))
                      || '月'
WHERE  INS_NENSHIKI IS NOT NULL
       AND INS_NENSHIKI != 'その他'
       AND Length(INS_NENSHIKI_NO) > 6;
commit;

主要是用了oracle的Substr函数和To_number函数,对字符串进行分割,之前用concat函数拼接,结果SQL运行的时候报错了,调查发现concat函数只能有两个参数,所以改用 || 进行字符串的拼接。

公司希望万一代码出错可以及时回滚,那就走一下整个流程吧:

/*备份:*/
CREATE TABLE ORDER_TEMP_TEMP AS SELECT * FROM ec_order;

/*修改:*/
UPDATE ORDER_TEMP
SET    INS_NENSHIKI = Substr(INS_NENSHIKI_NO, 1, 4)
                      || '年'
                      || To_number(Substr(INS_NENSHIKI_NO, 5, 2))
                      || '月~'
                      || Substr(INS_NENSHIKI_NO, 7, 4)
                      || '年'
                      || To_number(Substr (INS_NENSHIKI_NO, 11, 2))
                      || '月'
WHERE  INS_NENSHIKI IS NOT NULL
       AND INS_NENSHIKI != 'その他'
       AND Length(INS_NENSHIKI_NO) > 6;
commit;

/*回滚:*/
UPDATE ORDER_TEMP
SET    INS_NENSHIKI = (SELECT t1.INS_NENSHIKI AS NENSHIKI
                       FROM   ORDER_TEMP_TEMP t1
                       WHERE  t1.ORDER_ID = ORDER_TEMP.ORDER_ID
                              AND t1.INS_NENSHIKI IS NOT NULL
                              AND t1.INS_NENSHIKI != 'その他')
WHERE  EXISTS (SELECT 1
               FROM   ORDER_TEMP_TEMP t2
               WHERE  t2.ORDER_ID = ORDER_TEMP.ORDER_ID
                      AND t2.INS_NENSHIKI IS NOT NULL
                      AND t2.INS_NENSHIKI != 'その他');
commit;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值