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语句有点太长了,应该如何写好呢?希望高手指点~~

你可能感兴趣的:(oracle)