我在表A中具有以下IPv4 ipaddresses
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'的情况下(被切断,请使用更新语句和替换功能。
我尝试使用patindex函数获取最后一个点(。(的索引 0 :
select PATINDEX('.', IPAddress1) from TableA
返回:
0
理想情况下,我想到的是做以下操作:
字符串说明=启动位置不是确定的,因为某些值保持 -> .xx在最后一个值之前/group
之前有些.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)
其中的子句基本上寻找具有长度为11或12的IP,则意味着它们最终丢失了值。
我将SQL Server用作DBM。
我已经使用LEFT
,CHARINDEX
和REVERSE
在最后一个.
之前获取ipaddress2的一部分,而RIGHT
,CHARINDEX
和REVERSE
在最后一个.
之后获得ipaddress1的一部分。br>我还在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 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
尝试: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)
您可以使用sql Server的副词:
select parsename(Ipaddressv4,1) , Parsename(Ipaddressv4another, 1)
通过此功能,您可以检索IP第四部分的值。您可以将其用于更新...
您可以使用以下内容获得IP地址的最后一位数字:
SELECT RIGHT(IpAddress,CHARINDEX('.',REVERSE(IpAddress))-1)