2017-05-05 68 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 –