删除SQL中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,

我有一个名为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

这个答案去我的图书馆)这个答案去我的图书馆)