Sql rk。请在“192.168.130.1”-“192.168.130.254”范围内尝试“192.168.130.2”。@alwaysVBNET我已根据EdHarper更新Comment@JaydipJ与一些括号修复一起使用。好答案+1如果您使用这种方法,那
Sql rk。请在“192.168.130.1”-“192.168.130.254”范围内尝试“192.168.130.2”。@alwaysVBNET我已根据EdHarper更新Comment@JaydipJ与一些括号修复一起使用。好答案+1如果您使用这种方法,那,sql,sql-server,Sql,Sql Server,rk。请在“192.168.130.1”-“192.168.130.254”范围内尝试“192.168.130.2”。@alwaysVBNET我已根据EdHarper更新Comment@JaydipJ与一些括号修复一起使用。好答案+1如果您使用这种方法,那么值得注意的是.NetIPAddress.Parse方法会将填充前导零的IPv4地址的部分解释为八进制值-因此您需要小心这些值如何暴露给代码。这可能会影响其他语言。@EdHarper,thx,不知道这个。。。我编辑了我的答案并添加了一个带有十进
rk。请在“192.168.130.1”-“192.168.130.254”范围内尝试“192.168.130.2”。@alwaysVBNET我已根据EdHarper更新Comment@JaydipJ与一些括号修复一起使用。好答案+1如果您使用这种方法,那么值得注意的是.Net
IPAddress.Parse
方法会将填充前导零的IPv4地址的部分解释为八进制值-因此您需要小心这些值如何暴露给代码。这可能会影响其他语言。@EdHarper,thx,不知道这个。。。我编辑了我的答案并添加了一个带有十进制(12,0)
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
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;
Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type int.
select * from table where IPlow like '192.168.2.50' or IPHigh like '192.168.2.50'
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;
CREATE FUNCTION dbo.IPWidth3(@IP VARCHAR(100))
RETURNS VARCHAR(15)
BEGIN
DECLARE @RetVal VARCHAR(15);
WITH Splitted AS
(
SELECT CAST('<x>' + REPLACE(@IP,'.','</x><x>') + '</x>' AS XML) AS IPSplitted
)
SELECT @RetVal = STUFF(
(
SELECT '.' + REPLACE(STR(Part.value('.','int'),3),' ','0')
FROM Splitted.IPSplitted.nodes('/x') AS One(Part)
FOR XML PATH('')
),1,1,'')
FROM Splitted;
RETURN @RetVal;
END
GO
DECLARE @IP VARCHAR(100)='192.43.2.50';
SELECT dbo.IPWidth3(@IP);
192.043.002.050
CREATE FUNCTION dbo.IP_as_Number(@IP VARCHAR(100))
RETURNS DECIMAL(12,0)
BEGIN
DECLARE @RetVal DECIMAL(12,0);
WITH Splitted AS
(
SELECT CAST('<x>' + REPLACE(@IP,'.','</x><x>') + '</x>' AS XML) AS IPSplitted
)
SELECT @RetVal =
CAST((
SELECT REPLACE(STR(Part.value('.','int'),3),' ','0')
FROM Splitted.IPSplitted.nodes('/x') AS One(Part)
FOR XML PATH('')
) AS DECIMAL(12,0))
FROM Splitted;
RETURN @RetVal;
END
GO
DECLARE @IP VARCHAR(100)='192.43.2.50';
SELECT dbo.IP_as_Number(@IP);
DECLARE @IP NVARCHAR(30)='192.168.500.1'
SELECT * FROM
Branches
WHERE
CAST (PARSENAME(@IP,4) AS INT)>=CAST(PARSENAME(IPLow,4) AS INT) AND CAST(PARSENAME(@IP,3) AS INT)>=CAST(PARSENAME(IPLow,3) AS INT) AND CAST(PARSENAME(@IP,2) AS INT)>=CAST(PARSENAME(IPLow,2) AS INT) AND CAST(PARSENAME(@IP,1) AS INT)>=CAST(PARSENAME(IPLow,1) AS INT)
AND
CAST(PARSENAME( @IP,4) AS INT) <= CAST(PARSENAME(IPHigh ,4) AS INT) AND CAST(PARSENAME(@IP ,3) AS INT) <=CAST(PARSENAME(IPHigh ,3) AS INT) AND CAST(PARSENAME(@IP ,2) AS INT) <=CAST(PARSENAME(IPHigh ,2) AS INT) AND CAST(PARSENAME(@IP ,1) AS INT)<=CAST(PARSENAME(IPHigh ,1) AS INT)
DECLARE@ip VARCHAR(50)='192.168.0.81'
SELECT (SUBSTRING((@ip), 0,
patindex('%.%',
(@ip))))
,
substring((REPLACE(@ip, (SUBSTRING((@ip), 0,
patindex('%.%',
(@ip)) + 1)),
'')),
0,
patindex('%.%',
((REPLACE(@ip, (SUBSTRING((@ip), 0,
patindex('%.%',
(@ip)) + 1)),
''))))),
SUBSTRING((SUBSTRING(@ip, LEN((SUBSTRING((@ip), 0,
patindex('%.%',
(@ip))))) + 2 + LEN(substring((REPLACE(@ip, (SUBSTRING((@ip), 0,
patindex('%.%',
(@ip)) + 1)),
'')),
0,
patindex('%.%',
((REPLACE(@ip, (SUBSTRING((@ip), 0,
patindex('%.%',
(@ip)) + 1)),
'')))))) + 1,
LEN(@IP) - 1 - LEN(reverse(SUBSTRING(reverse(@ip), 0,
patindex('%.%',
reverse(@ip))))))), 0,
PATINDEX('%.%',
(SUBSTRING(@ip, LEN((SUBSTRING((@ip), 0,
patindex('%.%',
(@ip))))) + 2 + LEN(substring((REPLACE(@ip, (SUBSTRING((@ip), 0,
patindex('%.%',
(@ip)) + 1)),
'')),
0,
patindex('%.%',
((REPLACE(@ip, (SUBSTRING((@ip), 0,
patindex('%.%',
(@ip)) + 1)),
'')))))) + 1,
LEN(@IP) - 1 - LEN(reverse(SUBSTRING(reverse(@ip), 0,
patindex('%.%',
reverse(@ip))))))
))),
reverse(SUBSTRING(reverse(@ip), 0,
patindex('%.%',
reverse(@ip))))
CREATE FUNCTION dbo.IPAddressAsNumber (@IPAddress AS varchar(15))
RETURNS bigint
BEGIN
RETURN
CONVERT (bigint,
CONVERT(varbinary(1), CONVERT(int, PARSENAME(@IPAddress, 4))) +
CONVERT(varbinary(1), CONVERT(int, PARSENAME(@IPAddress, 3))) +
CONVERT(varbinary(1), CONVERT(int, PARSENAME(@IPAddress, 2))) +
CONVERT(varbinary(1), CONVERT(int, PARSENAME(@IPAddress, 1))) )
END
DECLARE @t table (ID int, Name varchar(50), Code int, IPLow varchar(15), IPHigh varchar(15))
INSERT INTO @t VALUES
(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')
SELECT * FROM @t
WHERE dbo.IPAddressAsNumber('192.168.2.50')
BETWEEN dbo.IPAddressAsNumber(IPLow) AND dbo.IPAddressAsNumber(IPHigh)
CREATE FUNCTION dbo.IPAddressFromNumber (@IPNumber AS bigint)
RETURNS varchar(15)
BEGIN
RETURN
CONVERT (varchar(15),
CONVERT(varchar(3), CONVERT(int, SUBSTRING(CONVERT(varbinary(4), @IPNumber), 1,1))) + '.' +
CONVERT(varchar(3), CONVERT(int, SUBSTRING(CONVERT(varbinary(4), @IPNumber), 2,1))) + '.' +
CONVERT(varchar(3), CONVERT(int, SUBSTRING(CONVERT(varbinary(4), @IPNumber), 3,1))) + '.' +
CONVERT(varchar(3), CONVERT(int, SUBSTRING(CONVERT(varbinary(4), @IPNumber), 4,1))) )
END
select *
from ip a
join ip_details b
on a.ip_address >= b.ip_start
and a.ip_address <= b.ip_end;
DECLARE @search varchar(50) = '192.168.2.50';
WITH DATA AS (
SELECT * FROM ( values
(1, 'Lucas', '192.130.1.1', '192.130.1.254'),
(2, 'Maria', '192.168.2.1', '192.168.2.254'),
(3, 'Julia', '192.150.3.1', '192.150.3.254')
) AS tbl (ID,Name,IPLow,IPHigh)
)
SELECT *
FROM DATA
WHERE REPLACE(STR(PARSENAME( @search, 4 ), 3, 0), ' ', '0')
+ REPLACE(STR(PARSENAME( @search, 3 ), 3, 0), ' ', '0')
+ REPLACE(STR(PARSENAME( @search, 2 ), 3, 0), ' ', '0')
+ REPLACE(STR(PARSENAME( @search, 1 ), 3, 0), ' ', '0')
BETWEEN
REPLACE(STR(PARSENAME( IPLow, 4 ), 3, 0), ' ', '0')
+ REPLACE(STR(PARSENAME( IPLow, 3 ), 3, 0), ' ', '0')
+ REPLACE(STR(PARSENAME( IPLow, 2 ), 3, 0), ' ', '0')
+ REPLACE(STR(PARSENAME( IPLow, 1 ), 3, 0), ' ', '0')
AND
REPLACE(STR(PARSENAME( IPHigh, 4 ), 3, 0), ' ', '0')
+ REPLACE(STR(PARSENAME( IPHigh, 3 ), 3, 0), ' ', '0')
+ REPLACE(STR(PARSENAME( IPHigh, 2 ), 3, 0), ' ', '0')
+ REPLACE(STR(PARSENAME( IPHigh, 1 ), 3, 0), ' ', '0')
CREATE FUNCTION dbo.IP_Comparable(@IP varchar(50))
RETURNS varchar(50)
WITH SCHEMABINDING
BEGIN
RETURN REPLACE(STR(PARSENAME( @IP, 4 ), 3, 0), ' ', '0')
+ REPLACE(STR(PARSENAME( @IP, 3 ), 3, 0), ' ', '0')
+ REPLACE(STR(PARSENAME( @IP, 2 ), 3, 0), ' ', '0')
+ REPLACE(STR(PARSENAME( @IP, 1 ), 3, 0), ' ', '0')
END
GO
DECLARE @search varchar(50) = '192.168.2.50';
WITH DATA AS (
SELECT * FROM ( values
(1, 'Lucas', '192.130.1.1', '192.130.1.254'),
(2, 'Maria', '192.168.2.1', '192.168.2.254'),
(3, 'Julia', '192.150.3.1', '192.150.3.254')
) AS tbl (ID,Name,IPLow,IPHigh)
)
SELECT *
FROM DATA
WHERE dbo.IP_Comparable(@search) BETWEEN dbo.IP_Comparable(IPLow) AND dbo.IP_Comparable(IPHigh)