oracle中translate函数

    今天做项目时有个需求,自动生成员工工号。工号的生成规则是“前缀”+9+“000001开始的流水号”,如“GS9000001”,而且工号要连续,下一个流水号为“GS9000002”。

    思路,找oracle数据库中员工工号c_code列9后面的字符串,计算最大值,然后+1生成流水号,在前台加上前缀。

 

    SELECT max(to_number(trim(substr(c_code,instr(c_code,'9'))),'9999999')) FROM tb_inf_employee;

 

    可一旦有脏数据,字符不能转成整数类型,max()返回字符对应编码最大的,to_number函数直接出错了。

    因此考虑过滤非数字的字符,上网查了一下,用oracle的translate函数

语法:TRANSLATE(char, from, to)

用法:返回将出现在from中的每个字符替换为to中的相应字符以后的字符串。
      若from比to字符串长,那么在from中比to中多出的字符将会被删除。

 

      三个参数中有一个是空,返回值也将是空值。   

      注意,你不能使用空字符串来作为to_string参数以用来移除char参数中的所有字符,oracle将空字符解释为null,如果这个函数中任何一个参数为null,那么将返回null。可用“#”代替,如translate("123abc他们456","#1234567890","#")->abc他们。     

    网上的例子,用于过滤字符中的非数字部分:

    select translate('23456中国3-00=.,45','0123456789'||'23456中国3-00=.,45','0123456789') from dual;

    pl/sql试了一下输出:2345630045,成功。修改后的sql:

 

SELECT         max(to_number(translate(trim(substr(c_code,instr(c_code,'9'))),'0123456789'||trim(substr(c_code,instr(c_code,'9'))),'0123456789') ,'9999999999999999999'))FROM tb_inf_employee;

 

    疑问,'0123456789'||'23456中国3-00=.,45'不理解,字符串或操作什么意思?上面的sql语句有点太长了,应该如何写好呢?希望高手指点~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值