1. 程式人生 > 實用技巧 >SQL判斷是否為數值型別

SQL判斷是否為數值型別

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

當含有美元符、加減號、逗號等符號時,或者D、E的前後均出現數字時,也會返回1,這就比較頭疼了。標點符號倒是好理解,為什麼d,e這種情況 不要問我為什麼,因為微軟的廠長是我表哥。

另外一個函式

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