在SQL Server中找出多少记录没有正确电话号码的最佳方法是什么?


11

我有一个领域,人们在历史上可以用来自由提供价值。我需要确定没有适当值的记录,以便清理它们。

我一直在SSIS中四处寻找。我的倾向是在某些C#代码中使用带有正则表达式的脚本组件,然后进行重定向。仍然,我想知道SSIS中是否有一种方法可以不使用C#来执行此操作。

我没有很多运气找到一种方法来找出多少记录没有适当的电话号码。


请问您有样品数据吗?
gbn

1
您可以在这里查看答案吗?
gbn

事情进展如何?你克服了这个障碍吗?
ErikE 2012年

Answers:


7

这是一项任务。编写一个小型应用程序或选择脚本,使用C#,VB.NET,T-SQL ...并手动分析所有模式。也许您会发现输入此数据的操作员的常用模式。为每个模式添加一个算法。将您的模式应用于数据库中的实际数据。删除所有“错误”记录。

运气。

添加:

作为选择,您可以使用电话号码数据库来检查person2number的有效性。


我个人不会删除“错误”的数字……因为这可能是您没有考虑过的模式(例如,有人以“ +”作为前缀)……在调试模式下运行了几次,其中它会报告它认为不好的值,并在进行任何修改之前先仔细检查一下。

@乔同意:我用两列“新”值和“旧”值来备份数据。这只是“强硬”一词:)
garik 2011年

4

SSIS = SQL Server集成服务-主要是一种将数据从多个来源集成到多个目标的方法。像是从excel / csv / text ..提取数据的引擎之类的东西..想到的其他文件..并将其移动到数据库中。或相反。

但是要真正选择和操作数据,您仍然可以/被要求使用T-SQL。

据我了解,T-SQL没有任何正则表达式组件可为您提供帮助,因此您将需要使用.NET程序集来做到这一点。


1

您可以通过以下WHERE子句获得快速估算,因为电话号码不应包含字母字符...除非您允许使用语音号码,例如。1-800-ANT-FARM。

WHERE phonenumber LIKE '%[a-zA-Z]%'

您不能使用LIKE进行复杂的正则表达式,但是可以近似得出。

我的测试:

WITH cte AS (
    SELECT id, phone
    FROM (
        VALUES
            (1, '1234567890'),
            (2, '4567890'),
            (3, '(123) 456-7890'),
            (4, '123-456-7890'),
            (5, '123.456.7890'),
            (6, 'Testing')
    )
    AS MyTable(id, phone)
)
SELECT *
FROM cte
WHERE phone LIKE '%[a-zA-Z]%'

1

这取决于电话号码可以接受或不接受

通过在搜索模式中使用NOT,可以为您提供所有非100%数字值

WHERE phonenumber LIKE '%[^0-9]%'

但是,如果你允许-还是(000)那么它的更复杂:需要样本数据请


0

尝试这样的事情:

WITH AreaCode (A) AS (
   SELECT '[0-9][0-9][0-9][-.]'
   UNION ALL SELECT '([0-9][0-9][0-9])-'
), Prefix (P) AS (
   SELECT '[0-9][0-9][0-9]-'
), Last4 (L) AS (
   SELECT '[0-9][0-9][0-9][0-9]'
), Ext1 (E1) AS (
   SELECT ' x'
   UNION ALL SELECT ' Ext.'
   UNION ALL SELECT ' ext'
), Ext2 (E2) AS (
   UNION ALL SELECT '[0-9][0-9]'
   UNION ALL SELECT '[0-9][0-9][0-9]'
   UNION ALL SELECT '[0-9][0-9][0-9][0-9]'
), Extension (E) AS (
  SELECT ''
  UNION ALL SELECT E1 + E2 FROM Ext1 CROSS JOIN Ext2
),
SELECT *
FROM
   YourTable Y
WHERE NOT EXISTS (
   SELECT *
   FROM
      AreaCode
      CROSS JOIN Prefix
      CROSS JOIN Last4
      CROSS JOIN Extension
   WHERE
      Y.PhoneNumber LIKE AreaCode + Prefix + Last4 + Extension
);

如果找到有效但查询未涵盖的模式,请将其添加到所示的零件中。如果您发现这两个部分需要结合在一起,则可以在扩展CTE(缺少CTE或Ext1和Ext2的组合)之后对其进行建模。如果您需要支持国际号码,并且它们具有不同的模式(与美国3-3-4不匹配),则需要进行一些分析和适当的关联,以使正确的国家/地区代码与正确的模式相匹配。例如,我知道在巴西的某些地区,这是一个有效数字:+55 85 1234-5678(国家/地区代码55,区号两位数,然后是4-4模式)。

帮助您分析数据的另一种技术是:

WITH Patterns (P) AS (
   SELECT
      Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(
         PhoneNumber,
         '1', '0'), '2', '0'), '3', '0'), '4', '0'),
         '5', '0'), '6', '0'), '7', '0'), '8', '0'), '9', '0'
      )
)
SELECT P, Count(*)
FROM Patterns
GROUP BY P;

通过忽略每行之间的实际电话号码差异并仅关注数字的排列和计数,可以帮助您了解数据的样子。如果有很多字母字符,请尝试开始使用列表中找不到的值替换有效的模式(例如“ ext”),以便将其余的虚假输入折叠成可以用类似的方式分析的内容Replace()字母表中的每个字母。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.