2017-05-05 39 views
1

,我有以下的IPv4 IPAddresses表A:IP地址的最后一组比较,并追加遗漏值

IPAddress1 | IPaddress2 
10.20.30.91 | 10.20.30.9 
63.90.84.45 | 63.90.84.45 
10.5.5.100 | 10.5.5.10 

我想最后一个点后检查最后一位数字/组()分离。例如,在第一条记录中,IPAddress1和IPAddress2分别以91和9结尾。在IPAddress2中,'1'被切断。我想编写T-SQL来比较这些最后的值,并且在1(或者它缺少的任何值 - 在记录3中它缺少'0')被切断的情况下,使用Update语句将1追加到它,替换功能。

我想最后的点()的获得指标使用PATINDEX功能,但因为点的出现了多次(),它返回:

select PATINDEX('.', IPAddress1) from TableA 

返回:

0 

理想是我脑子里想的是做以下几点:

串解释=起始位置不明确的,因为一些值保持 - > .XX一些.XXX的最后一个值/组前

串length_expression = 3,因为255是最大值,一个IP组可以容纳。

update TableA 
set IPAddress2 = replace(IPAddress2, SUBSTRING(IPAddress2, start_expression , length_expression, string_replacement) 
where (len(IPaddress2)=11) or (len(IPaddress2)=12) 

where子句基本上寻找长度为11或12的IP,这意味着它们最后缺少值。

我正在使用SQL Server作为DBMS。

+1

为什么不更新:'IPAddress2 = IPAddress1'? – gotqn

+0

那么,IPAddress1和IPAddress2应该是相同的? –

+0

不,它们不相同。这是我第一次想到 –

回答

1

我用LEFTCHARINDEXREVERSE最后.之前得到IPAddress2的一部分,RIGHTCHARINDEXREVERSE最后.后得到IPAddress1的一部分。
我也在where子句中使用了PARSENAME来只更新IPAddress2的最后部分与IPAddress1的最后部分不同的记录。

首先,创建并填充示例表(保存我们这一步在你未来的问题)

CREATE TABLE TableA 
(
    IPAddress1 varchar(15), 
    IPaddress2 varchar(15) 
) 

INSERT INTO TableA VALUES 
('10.20.30.91', '10.20.30.9'), 
('63.90.84.45', '63.90.84.45'), 
('10.5.5.100', '10.5.5.10') 

update语句:

UPDATE TableA 
SET IPAddress2 = LEFT(IPAddress2, LEN(IPAddress2) - CHARINDEX('.', REVERSE(IPAddress2))) + 
       RIGHT(IPAddress1, CHARINDEX('.', REVERSE(IPAddress1))) 
WHERE PARSENAME(IPAddress2, 1) <> PARSENAME(IPAddress1, 1) 

测试:

SELECT * 
FROM TableA 

结果:

IPAddress1  IPaddress2 
10.20.30.91  10.20.30.91 
63.90.84.45  63.90.84.45 
10.5.5.100  10.5.5.100 
+0

非常感谢! @Zohar Peled。我还喜欢你的解决方案是它忽略了没有任何缺失值的IP集。 –

0

您可以使用SQL Server的PARSENAME功能:

select parsename(Ipaddressv4,1) , Parsename(Ipaddressv4another, 1) 

通过此功能,您可以获取IP的第四部分的值。您可以使用更新...

0

您可以使用以下简单地获取IP地址的最后一位数字:

SELECT RIGHT(IpAddress,CHARINDEX('.',REVERSE(IpAddress))-1) 
1

TRY:这也是不错的与STUFF

UPDATE t SET IPAddress2 = STUFF(IPaddress2 , 
          (LEN(IPaddress2) - CHARINDEX('.', REVERSE(IPaddress2), 1)+2) , 
           LEN(Parsename(IPAddress2, 1)) ,parsename(IPAddress1,1)) 
FROM #tmp t 
WHERE PARSENAME(IPAddress1, 1) <> PARSENAME(IPAddress2, 1) 
+0

也可以:-) @Suraz –