有的時候我們可能會需要去判斷數據庫中一個字符串類型的字段是否是存的純數字,通常來說解決思路是先去找數據庫引擎提供的內置函數是否有能夠滿足需求的,沒有再另覓他法。
在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的時候,就能知道字符串不是純數字了。
"那一天我二十一歲,在我一生的黃金時代,我有好多奢望:我想愛,想喫,還想在一瞬間變成天上半明半暗的雲。後來我才知道,生活就是個緩慢受錘的過程:人一天天老下去,奢望也一天天消失。"