有的时候我们可能会需要去判断数据库中一个字符串类型的字段是否是存的纯数字,通常来说解决思路是先去找数据库引擎提供的内置函数是否有能够满足需求的,没有再另觅他法。
在sqlserver引擎中,自sqlserver2005起提供了一个isnumeric(expression)函数用于判断字符串是否为纯数字:当expression为数字时,返回1,否则返回0。
但是实际使用上却会存在偏差:
select isnumeric('123.456') as '123.456' -- 1 , isnumeric('-') as '-' -- 1 , isnumeric('+') as '+' -- 1 , isnumeric('$') as '$' -- 1 , isnumeric('.') as '.' -- 1 , isnumeric(',') as ',' -- 1 , isnumeric('\') as '\' -- 1 , isnumeric('1D1') AS '1D1' -- 1 , isnumeric('1E1') AS '1E1' -- 1 , isnumeric('1d1') AS '1d1' -- 1 , isnumeric('1e1') AS '1e1' -- 1 , isnumeric('d') AS 'd' -- 0 , isnumeric('e') AS 'e' -- 0
具体是,当字符串中含有美元符、加减号、逗号等符号时,或者在D、E的前后均出现数字时,也会返回1,而微软这样设计的原因成谜。
因此我们只能另觅他法,推荐使用patindex( '%pattern%', expression)检索函数配合正则表达式做判断:
select patindex('%[^0-9|.|-]%', '-1232.456'); -- 0 select patindex('%[^0-9|.|-]%', 'yanggb666'); -- 1
这样,当判断的结果为0的时候,字符串就是纯数字,可以用强制类型转换为数字类型;当判断结果不为0的时候,就能知道字符串不是纯数字了。
"那一天我二十一岁,在我一生的黄金时代,我有好多奢望:我想爱,想吃,还想在一瞬间变成天上半明半暗的云。后来我才知道,生活就是个缓慢受锤的过程:人一天天老下去,奢望也一天天消失。"