SQL判斷是否為數值型別
阿新 • • 發佈:2020-08-27
sql2005版本有個函式ISNUMERIC(expression)函式:當expression為數字時,返回1,否則返回0。
select ISNUMERIC('123') --結果為1
但是,該函式有個缺點!
1 SELECT 2 ,ISNUMERIC('-') as '-' --1 3 ,ISNUMERIC('+') as '+' --1 4 ,ISNUMERIC('$') as '$' --1 5 ,ISNUMERIC('.') as '.' --1 6 ,ISNUMERIC(',') as ',' --1 7 ,ISNUMERIC('\') as '\' --1 8 ,ISNUMERIC('2D3') AS '2D3'--1 9 ,ISNUMERIC('1d1') AS '1d1'--1 10 ,ISNUMERIC('1e1') AS '1e1'--1 11 ,ISNUMERIC('d') AS 'd' --0
另外一個函式
PATINDEX
適用場景:2005及以上(2005之前的版本沒試過,應該也支援)
SELECT PATINDEX('%[^0-9|.|-|+]%','2.2')--返回0 【帶小數點與正負極】
但又有一個漏洞
SELECT PATINDEX('%[^0-9|.|-|+]%','2.2.2') --返回0
蒼天啊大地啊,以不能偷懶了。結合二個函式寫一個數字驗證函式算了。
1 -- ============================================= 2 -- Author: <LYZ> 3 -- Create date: <2019-11-07> 4 -- Description: <判斷是否為數值型別> 5 -- ============================================= 6 Create function [dbo].[fn_GetIsNumeric](@Str nvarchar(50)) 7 Returns bit 8 As 9 begin 10 Declare @IsNum int,@ResultNum bit 11 set @ResultNum=0 12 set @IsNum=0 13 --首先看是否為數值型別 14 set @IsNum=(SELECT ISNUMERIC(@Str)) --為1時為數值類,為0時非法類 15 16 if @IsNum=1 17 begin 18 set @IsNum=(SELECT PATINDEX('%[^0-9|.]%',@Str)) --為1時非法數字,為0時為數量 19 if @IsNum=0 20 set @IsNum=2 21 else 22 set @IsNum=0 23 end 24 25 26 if @IsNum>0 27 set @ResultNum=1 28 return @ResultNum 29 end 30 GO