正常来说我们用来判断一个东西是否是数字,严格的写法应该是写个函数,使用to_muber函数来转换待判断的字符串,如果报错就不是数字。
今天从网上看了一段SQL,关于判断数字和字符的。
REGEXP_LIKE(x , '(^[+-]?\d{0,}\.?\d{0,}$)');
这段SQL里师是否正确呢?
显然下面这几种都不在上面正则表达式的范围内:
1/2 E 1E 1E0
于是我做了个测试,这几个东西到底是字符还是数字
习惯上我认为1/2是数字的,然而测试发现1/2并不是:
select to_number('1/2') from dual;
如果把引号去掉,则不会报错,
这说明了一个问题:“/”这个符号在SQL里是作为【除号】存在的,而不是我所理解的【分号】
所以这里的'1 / 2' 和 '1+ 1' 、 '3 * 8' 一样都属于字符串,他的计算结果是个数字,而自身却是一段字符类型的表达式
同样的方法测试E、1E、1E0发现:
1E和1E0都是1 的意思,而在数据库里,1E用于在计算表达式计算的时候可以被隐式转换,却不能在比较和to_number的时候转换
所以:
E是字符
1E是表达式
1E0是数字
然而在测试的时候
1E同样不能被to_number转换,神奇的是却可以在比较的时候进行转换,也可以插入到number类型的字段中。
下面这段SQL却可以正常插入。
create table char_test
(char_test varchar2(50),
num_test number);
insert into char_test(char_test,num_test)
select '1E',1E from dual;
所以说1E这个比较特殊