关于数字和字符的研究

浏览: 1038

正常来说我们用来判断一个东西是否是数字,严格的写法应该是写个函数,使用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;

Clipboard Image.png

如果把引号去掉,则不会报错,

Clipboard Image.png

这说明了一个问题:“/”这个符号在SQL里是作为【除号】存在的,而不是我所理解的【分号

所以这里的'1 / 2' 和 '1+ 1' 、 '3 * 8' 一样都属于字符串,他的计算结果是个数字,而自身却是一段字符类型的表达式


同样的方法测试E、1E、1E0发现:

1E和1E0都是1 的意思,而在数据库里,1E用于在计算表达式计算的时候可以被隐式转换,却不能在比较和to_number的时候转换

所以:

E是字符

1E是表达式

1E0是数字


然而在测试的时候

1E同样不能被to_number转换,神奇的是却可以在比较的时候进行转换,也可以插入到number类型的字段中。

Clipboard Image.png

Clipboard Image.png


下面这段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这个比较特殊


推荐 4
本文由 老头子 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册