我有一个领域,人们在历史上可以用来自由提供价值。我需要确定没有适当值的记录,以便清理它们。
我一直在SSIS中四处寻找。我的倾向是在某些C#代码中使用带有正则表达式的脚本组件,然后进行重定向。仍然,我想知道SSIS中是否有一种方法可以不使用C#来执行此操作。
我没有很多运气找到一种方法来找出多少记录没有适当的电话号码。
我有一个领域,人们在历史上可以用来自由提供价值。我需要确定没有适当值的记录,以便清理它们。
我一直在SSIS中四处寻找。我的倾向是在某些C#代码中使用带有正则表达式的脚本组件,然后进行重定向。仍然,我想知道SSIS中是否有一种方法可以不使用C#来执行此操作。
我没有很多运气找到一种方法来找出多少记录没有适当的电话号码。
Answers:
这是一项任务。编写一个小型应用程序或选择脚本,使用C#,VB.NET,T-SQL ...并手动分析所有模式。也许您会发现输入此数据的操作员的常用模式。为每个模式添加一个算法。将您的模式应用于数据库中的实际数据。删除所有“错误”记录。
运气。
添加:
作为选择,您可以使用电话号码数据库来检查person2number的有效性。
您可以通过以下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]%'
尝试这样的事情:
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()
字母表中的每个字母。