删除SQL中Ip地址的前导零
我有一个名为IP的列,其中包含删除SQL中Ip地址的前导零,sql,tsql,replace,Sql,Tsql,Replace,我有一个名为IP的列,其中包含10.001.99.108 我想运行一个脚本,将其更改为10.1.99.108 我以前用过这个: update TABLE set IP = substring(IP, patindex('%[^0]%',IP), 10) 但这会删除行乞时的前导零 我不知道怎样才能把它改成第二段。你可以用parsename()和一个删除前导零的方法来完成。以下内容通过强制转换为整数然后返回到字符串来删除前导零: select (cast(cast(parsename(ip,
10.001.99.108
我想运行一个脚本,将其更改为10.1.99.108
我以前用过这个:
update TABLE set IP = substring(IP, patindex('%[^0]%',IP), 10)
但这会删除行乞时的前导零
我不知道怎样才能把它改成第二段。你可以用
parsename()
和一个删除前导零的方法来完成。以下内容通过强制转换为整数然后返回到字符串来删除前导零:
select (cast(cast(parsename(ip, 4) as int) as varchar(255)) +
cast(cast(parsename(ip, 3) as int) as varchar(255)) +
cast(cast(parsename(ip, 2) as int) as varchar(255)) +
cast(cast(parsename(ip, 1) as int) as varchar(255))
)
您可以使用
parsename()
和删除前导零的方法来完成此操作。以下内容通过强制转换为整数然后返回到字符串来删除前导零:
select (cast(cast(parsename(ip, 4) as int) as varchar(255)) +
cast(cast(parsename(ip, 3) as int) as varchar(255)) +
cast(cast(parsename(ip, 2) as int) as varchar(255)) +
cast(cast(parsename(ip, 1) as int) as varchar(255))
)
试试这个解决方案
DECLARE @IpAdress AS TABLE ( IP VARCHAR(100) )
INSERT @IpAdress
( IP )
VALUES ( '10.001.99.108' ),
( '010.001.099.008' ),
( '080.081.999.008' );
WITH Tally
AS ( SELECT n = 1
UNION ALL
SELECT n + 1
FROM Tally
WHERE n <= 100
),
split
AS ( SELECT i.IP ,
CONVERT(INT, ( CASE WHEN CHARINDEX('.', S.string) > 0
THEN LEFT(S.string,
CHARINDEX('.', S.string)
- 1)
ELSE string
END )) AS part
FROM @IpAdress AS i
INNER JOIN Tally AS T ON SUBSTRING('.' + IP, T.N, 1) = '.'
AND T.N <= LEN(i.IP)
CROSS APPLY ( SELECT String = ( CASE
WHEN T.N = 1
THEN LEFT(i.IP,
CHARINDEX('.',
i.IP) - 1)
ELSE SUBSTRING(i.IP,
T.N, 1000)
END )
) S
)
SELECT DISTINCT
o.ip ,
SUBSTRING(( SELECT '.' + CONVERT(VARCHAR, i.part)
FROM split AS i
WHERE i.ip = o.ip
FOR
XML PATH('')
), 2, 1000) AS newIP
FROM split AS o
试试这个解决方案
DECLARE @IpAdress AS TABLE ( IP VARCHAR(100) )
INSERT @IpAdress
( IP )
VALUES ( '10.001.99.108' ),
( '010.001.099.008' ),
( '080.081.999.008' );
WITH Tally
AS ( SELECT n = 1
UNION ALL
SELECT n + 1
FROM Tally
WHERE n <= 100
),
split
AS ( SELECT i.IP ,
CONVERT(INT, ( CASE WHEN CHARINDEX('.', S.string) > 0
THEN LEFT(S.string,
CHARINDEX('.', S.string)
- 1)
ELSE string
END )) AS part
FROM @IpAdress AS i
INNER JOIN Tally AS T ON SUBSTRING('.' + IP, T.N, 1) = '.'
AND T.N <= LEN(i.IP)
CROSS APPLY ( SELECT String = ( CASE
WHEN T.N = 1
THEN LEFT(i.IP,
CHARINDEX('.',
i.IP) - 1)
ELSE SUBSTRING(i.IP,
T.N, 1000)
END )
) S
)
SELECT DISTINCT
o.ip ,
SUBSTRING(( SELECT '.' + CONVERT(VARCHAR, i.part)
FROM split AS i
WHERE i.ip = o.ip
FOR
XML PATH('')
), 2, 1000) AS newIP
FROM split AS o
这个答案去我的图书馆)这个答案去我的图书馆)