TRANSLATE()函数

接触到此函数目的是为了判断某一单元格数据是在这里插入代码片否为纯数字,虽然实际来说TRANSLATE()实际不是为了判断数据格式。如:

SELECT '数据' AS DATAS FROM DUAL WHERE NVL2(TRANSLATE('1230000133','0123456789','\'),'IS NOT NUMBER','IS NUMBER')='IS NUMBER';

上述SQL脚本未返回数据,分析结果反推可知

  1. NVL2()函数获取得到的结果为’IS NOT NUMBER’
  2. TRANSLATE()函数获取得到的结果不是一个空值这就纳闷了,一开始认为TRANSLATE()函数的用法是出现0-9的数据都会被删除掉,单独执行看看获取得到的结果
SELECT RANSLATE('1230000133','0123456789','\')  FROM DUAL;
  1. 发现返回结果为’\\’,得到的结果个数和0单字符的个数一致,其它的字符被清空处理,将0放置在末尾的位置,发现返回的结果为1出现的次数一致。
  2. 查询资料,理解TRANSLATE()函数用法,毕竟之前的是在他人基础上进行copy直接复用,没怎么去理解。

函数写法:TRANSLATE(EXPR,FROM_STRING,TO_STRING)

  • EXPR:被转换的字符串
  • FROM_STRING :被替换的字符集合
  • TO_STRING:用来替换FROM_STRING的字符集合

TRANSLATE()函数_第1张图片

如上述,TO_STRING中的字符串‘\’对应的位置为FROM_STRING中的‘0’,而对于FROM_STRING中的‘1-9’字符集在TO_STRING中没有对应的替换。FROM_STRING的字符集相当于EXPR值的枚举值,EXPR每一个字符去FROM_STRING找到对应的位置,再以此位置顺序去TO_STRING字符集中找对应的替换。在TO_STRING中没有找到的话,则EXPR删除此字符,而EXPR中的字符在FROM_STRING中没有的话则保留。
这也就是为什么选择TRANSLATE()函数来作为判断一串字符串是否为纯数字,如TRANSLATE(‘AAA1234567890’,’\0123456789’,’’),发现此方法将’0-9’字符都删除了,得到的结果为’AAA’,再联合NVL()函数判断得到的结果是否为空而确定单元格数据是否为纯数字。
与REPLACE()方法的区别:
REPLACE(expr,from_string,to_string)函数中,from_string和to_string是以字符串为单位,单纯的将expr中存在from_string字符串替换成to_string定义的字符串;对于TRANSLATE()函数来说,他是以字符为单位的,from_string 和to_string中定义的 字符集合是对位替换,对于expr中在from_string出现的字符,以位置找到to_string中的值

你可能感兴趣的:(ORACLE基础知识)