【问题标题】:Remove trailing zeros from phone number从电话号码中删除尾随零
【发布时间】:2022-01-19 08:26:39
【问题描述】:

我有一个旧的 Phone 表,它有一个长度为 15 的 PhonoNo 列。现在我正在处理电话号码清理任务,在 10 位数字后使用尾随 0。

+----------------+---------------+
|    PhoneNo     | Desire output |
+----------------+---------------+
|198765432100000 |    1987654321 |
|   198765432100 |    1987654321 |
|     1987653210 |    1987653210 |
|    19876543210 |    1987654321 |
|198765432100100 | 1987654321001 |
|       19876543 |      19876543 |
|      009876543 |     009876543 |
+----------------+---------------+

我正在使用下面的代码,但它对我不起作用。

SELECT PhoneNo, REPLACE(LTRIM(REPLACE(PhoneNo,'0',' ')),' ','0') as NewPhoneNo 
FROM tblPhone WITH(NOLOCK) 

我正在寻找 SQL Server 中的解决方案,以在不创建任何函数的情况下删除尾随 0。

【问题讨论】:

  • 从电话号码中删除尾随的 0?那你就不能再给我打电话了。
  • after 10 digits. ?那么为什么 98765432100000 的所有尾随零都被删除了
  • @Squirrel 已更新问题,谢谢指出。
  • 停止使用 WITH(NOLOCK) !

标签: sql sql-server tsql


【解决方案1】:

一个可能的选项是TRIM() 函数(需要 SQL Server 2017+)。默认情况下,TRIM() 函数会从字符串的开头和结尾删除空格字符或其他指定字符,因此您需要在正确的位置(第 1 和第 10)放置一个附加字符(示例中为 #)和之后删除它:

SELECT 
   REPLACE(
      TRIM('0' FROM '#' + SUBSTRING(PhoneNo, 1, 10) + '#' + SUBSTRING(PhoneNo, 11, 5)),
      '#',
      ''
   ) AS PhoneNo   
FROM (VALUES
   ('19876543210000'),
   ('198765432100'),
   ('1987653210'),
   ('19876543210'),
   ('198765432100100'),
   ('19876543'),
   ('009876543')
) t (PhoneNo)

结果:

PhoneNo
-------------
1987654321
1987654321
1987653210
1987654321
1987654321001
19876543
009876543

【讨论】:

  • 987653210 的工作原理
  • @Arshad,987653210(因为电话号码是 10 位数字)或98765321 的预期结果是什么?
  • 想要的结果是987653210 (因为电话号码是10位数)
  • @Arshad,那么98765432100000 - 9876543210987654321 的预期结果是什么?
  • 我已经更新了问题中的示例数据
【解决方案2】:

您可以使用CASE 表达式原样返回小于或等于10 个字符的值,然后使用REPLACERTRIM 删除尾随的0:

SELECT CASE WHEN LEN(PhoneNo) <= 10 THEN PhoneNo
            ELSE REPLACE(RTRIM(REPLACE(PhoneNo,'0',' ')),' ','0')
       END
FROM (VALUES ('198765432100000'),
             ('198765432100'),
             ('1987653210'),
             ('19876543210'),
             ('198765432100100'),
             ('19876543'),
             ('009876543'))V(PhoneNo);

【讨论】:

  • 这不适用于00000000000。理想情况下,应该修剪到 10 个字符。
  • 老实说,@Arshad 甚至不会提及这个例子。电话号码全由零组成,这很愚蠢,而且您还添加了多个任意要求。
  • 我认为这可以通过子字符串来完成,直到 10 个字符 + 其余字符的现有替换功能。
  • 它对我有用 SELECT SUBSTRING(PhoneNo, 1, 10) + REPLACE(RTRIM(REPLACE(SUBSTRING(PhoneNo, 11, LEN(PhoneNo)-10),'0',' ')),' ','0') FROM (VALUES ('000100000000'), ('00000000000'))V(PhoneNo) 。谢谢!
【解决方案3】:

或更短:

SELECT IIF(LEN(PhoneNo) <= 10, PhoneNo, REPLACE(RTRIM(REPLACE(PhoneNo, '0', ' ')), ' ', '0'))

[这是基于拉努的回答]

【讨论】:

  • 这不适用于00000000000
【解决方案4】:

您可以使用字符串函数LEFTPATINDEXREVERSE的组合如下:

SELECT PhoneNo, 
       Left(PhoneNo, 
            IIF(Len(PhoneNo)-PATINDEX('%[1-9]%',Reverse(PhoneNo))+1<=10 Or PhoneNo Like '%[^1-9]%', 
                10,
                Len(PhoneNo)-PATINDEX('%[1-9]%', Reverse(PhoneNo))+1)) As NewPhoneNo 
FROM tblPhone

输出:

PhoneNo              NewPhoneNo
-------------------- --------------------
19876543210000       1987654321
198765432100         1987654321
1987653210           1987653210
19876543210          1987654321
198765432100100      1987654321001
19876543             19876543
009876543            009876543

【讨论】:

    猜你喜欢
    • 2012-07-01
    • 2012-07-02
    • 2011-05-30
    • 2015-06-16
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多