我们在SQL中经常要判断字符串字段中的内容能否转为数值,经过网络搜索、借鉴大咖的写法,再结合的自己的想法,写下这一篇文章备忘

测试数据

/*************************************
* 测试数据                           *
* 测试环境:SQL2008r2                *
* 测试日期:2018-03-27               *
*************************************/
declare @test table 
	(
	ID nvarchar(10)
	)
insert into @test(ID) 
values	
	('+123'), ('-8'), ('12-'), ('12345'), ('12x45'), ('+12-45'), ('-12.45'), 
	('+12.45'), ('123456'), ('12345z'), ('798'), ('7'), ('1280'), ('xy45'), 
	('xyz'), ('17'), ('34'), (N'电视'), ('123\45'), ('3.5'), ('4.8.5'), (''), (null),
        ('$'), ('2D3'), ('1e1')
	
select * from @test order by ID
一、纯数字 (不支持正负数,小数点)
/*************************************
* 一、纯数字 (不支持正负数,小数点)  *
*************************************/
-- 1. not like 写法
select * 
select *   
from @test   
where 1=1 
	and id not like '%[^0-9]%'	-- 纯数字(排除0~9以外字符)
	and isnull(ID, '') <> ''	-- 排除null和空字符串  	
order by ID   

-- 2. patindex 写法
select * 
from @test 
where 1=1 
	and patindex('%[^0-9]%', ID) = 0	-- 纯数字(排除0~9以外字符)
	and isnull(ID, '') <> ''	        -- 排除null和空字符串	      
order by ID	 
二、纯数值 (支持正负数,小数点)
/***********************************
* 二、纯数值 (支持正负数,小数点)  *
***********************************/
-- 1. isnumeric()函数 
select * 
from @test 
where isnumeric(ID) = 1 
order by ID

-- 注意:isnumeric()函数有个缺点!
-- select 
-- ,isnumeric('-') as '-'    --1
-- ,isnumeric('+') as '+'    --1
-- ,isnumeric('$') as '$'    --1
-- ,isnumeric('.') as '.'    --1
-- ,isnumeric(',') as ','    --1
-- ,isnumeric('\') as '\'    --1
-- ,isnumeric('2D3') AS '2D3'--1
-- ,isnumeric('1d1') AS '1d1'--1
-- ,isnumeric('1e1') AS '1e1'--1
-- ,isnumeric('d') AS 'd'   --0
--当含有美元符、加减号、逗号等符号时,或者D、E的前后均出现数字时,也会返回1,这就比较头疼了。
--标点符号倒是好理解,为什么d,e这种情况,真是不理解微软设计的意图。

-- 2. isnumeric() 函数加强版 (推荐)
select * 
from @test 
where isnumeric(ID) = 1 
	-- 不能包含0~9、+、-、.以外字符	(注意:负号(-)必须要最前或最後, 否则负号不生效) 
	and id not like '%[^0-9|+|.|-]%'		
order by ID

-- 3. not like 写法
select * 
from @test 
where 1=1
	-- 不能包含0~9、+、-、.以外字符	(注意:负号(-)必须要最前或最後, 否则负号不生效) 
	and id not like '%[^0-9|+|.|-]%'		
	-- 正号(+)、负号(-)的必须放在前面
	and (charindex('+', ID) <= 1 and charindex('-', ID) <= 1)
	-- 小数点(.)只能出现1次 	
	and len(id)-len(replace(id, '.', '')) <= 1
	-- 排除null和空字符串
	and isnull(ID, '') <> '' 
order by ID 

-- 4. patindex 写法
select * 
from @test 
where 1=1 
	-- 不能包含0~9、+、-、.以外字符	(注意:负号(-)必须要最前或最後, 否则负号不生效) 
	and patindex('%[^0-9|+|.|-]%', ID) =0  
	-- 正号(+)、负号(-)的必须放在前面	
	and (charindex('+', ID) <= 1 and charindex('-', ID) <= 1) 	
	-- 小数点(.)只能出现1次 
	and len(id)-len(replace(id, '.', '')) <= 1
	-- 排除null和空字符串
	and isnull(ID, '') <> ''
order by ID	 
 三、Like其它常用写法
/********************************
*  三、Like其它常用写法			*
********************************/
select * 
from @test 
where 1=1
	--and id like '%[^0-9]%'		-- 有包含0~9以外的字符
	--and id not like '%[^0-9]%'	-- 纯数字(排除0~9以外字符)
	--and id like '%[x]%'			-- 包含x
	--and id like '%[0-9]%'			-- 包含0~9
	--and id like '%[+,-,.]%'		-- 包含+、-、.
	--and id not like '%[+,-,.]%'	-- 不包+、-、.

	--and id like '[+,-]%'			-- 以+、-开头
	--and id like '[^+,^-]%'		-- 排除+、-开头 
	--and id like '[0-9]%'			-- 0~9开头
	--and id like '[0-9]%[0-9]'		-- 0~9开头,0~9结尾(两位或以上字符串)
	--and id like '[0-9]%[^A-Z]'	-- 以[0~9]开头,不以[A~Z]结尾

	--and id like '%[0-9]'			-- 0~9结尾	
	--and id like '__45'			-- 以45结尾, 长度为4 (_为占位符)

	--and id like '12_45'			-- 12开头, 45结尾, 长度为5 (_为占位符)
order by ID 




本文转载:CSDN博客