从名为 PhoneNumber 的字段中删除部分电话号码

问题描述 投票:0回答:2

我想从名为 PhoneNumber 的字段中选择电话号码的一部分,这些号码如示例所示

  • (343)765-58584
  • (343)765-6544
  • (343)765-6758
  • 等等

数字具有相同的模式,就像这样。因此,我想从此号码中选择三个不同的部分,即:国家/地区代码、区域代码和号码,即使这些号码不包含国家/地区代码,但我想将其添加为字段以防万一。 这是我们对输出的期望。 正确的输出:

国家/地区代码 区号 数量
343 767-58584
sql sql-server sql-server-2022
2个回答
1
投票

我确信有很多方法可以做到这一点。这是使用

CharIndex
的简单解决方案,这似乎是最明显的(尽管它可能是也可能不是最好的)。

此处不尝试处理错误...根据数据的一致性和统一程度,您将得到更好或更差的结果。

DECLARE @Phones TABLE (Phone NVARCHAR(100))

DECLARE @Result TABLE (
    OriginalValue NVARCHAR(100),
    Idx INT,
    AreaCode NVARCHAR(100),
    Phone NVARCHAR(100))

INSERT INTO @Phones 
    VALUES 
    (N'(123)456-7890'),
    (N'(123)456-78901')

INSERT INTO @Result (
    OriginalValue,
    Idx)
SELECT 
    p.Phone, 
    CHARINDEX(')', p.Phone) AS Idx
FROM 
    @Phones p

UPDATE r
SET 
    r.AreaCode = SUBSTRING(OriginalValue, Idx-3, 3),
    r.Phone = SUBSTRING(OriginalValue, Idx+1, 100)
FROM @Result r
WHERE r.Idx > 0

SELECT * FROM @Result

结果是:

原值 Idx 区号 电话
(123)456-7890 5 123 456-7890
(123)456-78901 5 123 456-78901

您当然会删除 Idx 列和原始值列,并使用区域和电话列来填充清理后的数据...

我刚刚注意到您所说的国家/地区代码是区号,但无论如何我确信您可以根据需要处理该部分。


0
投票

假设数据是干净的(每次格式都相同),您可以对传入值 [电话号码] 使用 SUBSTRING 函数:

SELECT 
 SUBSTRING([phonenumber], 2, 3) as AreaCode
,SUBSTRING([phonenumber], 5, 9) as Number 

请注意,我在“数字”字段中使用了“9”,因为您的示例中有一个带有额外数字的值,但如果这是您的拼写错误,那么您可以将其更改为“8”。或者,如果您想在最后捕获任意数量的数字,您可以将值设置得更高。如果只有 8 个字符,将其设置为“100”仍然只返回 8 个字符。

如果数据实际上并不干净,您可以使用 REPLACE 和/或 STUFF 函数对其进行清理,以删除不需要的值。

© www.soinside.com 2019 - 2024. All rights reserved.