zoukankan      html  css  js  c++  java
  • 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
     
     
     
  • 相关阅读:
    SCUT
    SCUT
    SCUT
    ???
    Codeforces
    SCUT
    SCUT
    SCUT
    SCUT
    2019牛客暑期多校训练营(第八场)
  • 原文地址:https://www.cnblogs.com/approx/p/11812073.html
Copyright © 2011-2022 走看看