您可以使用PARSENAME函数将IP地址值分成四部分并分别进行比较。
创建并填充测试数据脚本:
CREATE TABLE ipaddresses
(
ip VARCHAR(20) NOT NULL
);
INSERT INTO ipaddresses (ip) VALUES
('192.12.34.12'),
('192.12.#.12'),
('192.#.34.12');
方案1
DECLARE @userip VARCHAR(20)
SET @userip = '192.56.34.12'
;WITH ips AS
(
SELECT REPLACE(ip, '#', '%') AS ip
FROM ipaddresses
)
SELECT COUNT(ip) AS validcount
FROM ips
WHERE PARSENAME(@userip, 1) LIKE PARSENAME(ip, 1)
AND PARSENAME(@userip, 2) LIKE PARSENAME(ip, 2)
AND PARSENAME(@userip, 3) LIKE PARSENAME(ip, 3)
AND PARSENAME(@userip, 4) LIKE PARSENAME(ip, 4);
VALIDCOUNT
----------
1
方案2
DECLARE @userip VARCHAR(20)
SET @userip = '191.12.34.12'
;WITH ips AS
(
SELECT REPLACE(ip, '#', '%') AS ip
FROM ipaddresses
)
SELECT COUNT(ip) AS validcount
FROM ips
WHERE PARSENAME(@userip, 1) LIKE PARSENAME(ip, 1)
AND PARSENAME(@userip, 2) LIKE PARSENAME(ip, 2)
AND PARSENAME(@userip, 3) LIKE PARSENAME(ip, 3)
AND PARSENAME(@userip, 4) LIKE PARSENAME(ip, 4);
VALIDCOUNT
----------
0
运气好的时候,我们向IPv6迁移,哈哈。 – Styxxy
此外,我怀疑这个例子是过于简化,它会需要超过五个比较。也许...... heh –
应该是15,假设你不需要匹配#。#。#。# –