我想从名为 PhoneNumber 的字段中选择电话号码的一部分,这些号码如示例所示
(343)765-58584
(343)765-6544
(343)765-6758
数字具有相同的模式,就像这样。因此,我想从此号码中选择三个不同的部分,即:国家/地区代码、区域代码和号码,即使这些号码不包含国家/地区代码,但我想将其添加为字段以防万一。 这是我们对输出的期望。 正确的输出:
国家/地区代码 | 区号 | 数量 |
---|---|---|
343 | 767-58584 |
我确信有很多方法可以做到这一点。这是使用
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 列和原始值列,并使用区域和电话列来填充清理后的数据...
我刚刚注意到您所说的国家/地区代码是区号,但无论如何我确信您可以根据需要处理该部分。
假设数据是干净的(每次格式都相同),您可以对传入值 [电话号码] 使用 SUBSTRING 函数:
SELECT
SUBSTRING([phonenumber], 2, 3) as AreaCode
,SUBSTRING([phonenumber], 5, 9) as Number
请注意,我在“数字”字段中使用了“9”,因为您的示例中有一个带有额外数字的值,但如果这是您的拼写错误,那么您可以将其更改为“8”。或者,如果您想在最后捕获任意数量的数字,您可以将值设置得更高。如果只有 8 个字符,将其设置为“100”仍然只返回 8 个字符。
如果数据实际上并不干净,您可以使用 REPLACE 和/或 STUFF 函数对其进行清理,以删除不需要的值。