I have a table which stores a ID
, Name
, Code
, IPLow
, IPHigh
such as:
1, Lucas, 804645, 192.130.1.1, 192.130.1.254 2, Maria, 222255, 192.168.2.1, 192.168.2.254 3, Julia, 123456, 192.150.3.1, 192.150.3.254
Now, if I have an IP address 192.168.2.50
, how can I retrieve the matching record?
Edit
Based on Gordon’s answer (which I’m getting compilation errors) this is what I have:
select PersonnelPC.* from (select PersonnelPC.*, ( cast(parsename(iplow, 4)*1000000000 as decimal(12, 0)) + cast(parsename(iplow, 3)*1000000 as decimal(12, 0)) + cast(parsename(iplow, 2)*1000 as decimal(12, 0)) + (parsename(iplow, 1)) ) as iplow_decimal, ( cast(parsename(iphigh, 4)*1000000000 as decimal(12, 0)) + cast(parsename(iphigh, 3)*1000000 as decimal(12, 0)) + cast(parsename(iphigh, 2)*1000 as decimal(12, 0)) + (parsename(iphigh, 1)) ) as iphigh_decimal from PersonnelPC ) PersonnelPC where 192168002050 between iplow_decimal and iphigh_decimal;
but this gives me an error:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
Any ideas?
Advertisement
Answer
Painfully. SQL Server has lousy string manipulation functions. It does, however, offer parsename()
. This approach converts the IP address to a large decimal value for the comparison:
select t.* from (select t.*, (cast(parsename(iplow, 4)*1000000000.0 as decimal(12, 0)) + cast(parsename(iplow, 3)*1000000.0 as decimal(12, 0)) + cast(parsename(iplow, 2)*1000.0 as decimal(12, 0)) + cast(parsename(iplow, 1) as decimal(12, 0)) ) as iplow_decimal, (cast(parsename(iphigh, 4)*1000000000.0 as decimal(12, 0)) + cast(parsename(iphigh, 3)*1000000.0 as decimal(12, 0)) + cast(parsename(iphigh, 2)*1000.0 as decimal(12, 0)) + cast(parsename(iphigh, 1) as decimal(12, 0)) ) as iphigh_decimal from t ) t where 192168002050 between iplow_decimal and iphigh_decimal;
I should note that IP addresses are often stored in the database as the 4-byte unsigned integers. This makes comparisons much easier . . . although you need complicated logic (usually wrapped in a function) to convert the values to a readable format.