今天在查询数据的时候,突然要查指定IP范围内的IP总数,思考了一下,主要使用charindex和reverse,下面是详细的SQL语句
DECLARE @IP varchar(50),@IPSub varchar(40),@range varchar(10),@beginIP varchar(50),@endIP varchar(50),@max int,@min int,@count intSET @IP='62.145.88.0/24'SET @range=right(@IP,charindex('.',reverse(@IP))-1)--获取第三个ip后的字符串--PRINT @rangeSET @IPSub= substring(@IP,0,len(@IP)-charindex('.',reverse(@IP))+2)--获取ip前三段字符串SET @max=substring(@range,0,charindex('/',@range))--获取最大值,假装的--PRINT @maxSET @min=substring(@range,charindex('/',@range)+1,len(@range)-charindex('/',@range))--获取最小值,假装的--PRINT @minIF @max<@minbegin SET @[email protected]+convert(varchar(5),@max) SET @[email protected]+convert(varchar(5),@min) PRINT @beginIP PRINT @endIPendelsebegin SET @[email protected]+convert(varchar(5),@min) SET @[email protected]+convert(varchar(5),@max) PRINT @beginIP PRINT @endIPendSET @count=(SELECT count(*) FROM UserActivityLog where RemoteAddr BETWEEN @beginIP AND @endIP)PRINT @count
但是这方法也是有问题的,因为这里使用了字符串来查询,这里可以考虑使用
parsename(@ip,4)*cast(16777216 as bigint)+parsename(@ip,3)*65536+ parsename(@ip,2)*256+parsename(@ip,1)