六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 259|回复: 0

oracle中translate函数

[复制链接]

升级  40%

4

主题

4

主题

4

主题

童生

Rank: 1

积分
20
 楼主| 发表于 2013-1-29 15:25:57 | 显示全部楼层 |阅读模式
    今天做项目时有个需求,自动生成员工工号。工号的生成规则是“前缀”+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语句有点太长了,应该如何写好呢?希望高手指点~~
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表