【问题标题】:Remove Leading Zeros On Ip Address in SQL删除 SQL 中 IP 地址上的前导零
【发布时间】:2015-03-18 15:24:56
【问题描述】:

我有一个名为 IP 的列,其中包含 10.001.99.108 等数据

我想运行一个脚本来改变它看起来像10.1.99.108

我以前用过这个:

update TABLE set IP =  substring(IP, patindex('%[^0]%',IP), 10) 

但这会删除乞求时的前导零。

我不确定如何将其更改为第二段。

【问题讨论】:

    标签: sql tsql replace


    【解决方案1】:

    您可以使用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))
           )
    

    【讨论】:

    • 这个答案转到我的图书馆)
    【解决方案2】:

    试试这个解决方案

    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
    

    输出结果

    ip                    newIP
    010.001.099.008       10.1.99.8
    080.081.999.008       80.81.999.8
    10.001.99.108         10.1.99.108
    

    【讨论】:

      猜你喜欢
      • 2014-09-16
      • 2020-01-20
      • 1970-01-01
      • 2012-04-14
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      相关资源
      最近更新 更多