SQL Serverで適切な電話番号が設定されていないレコードの数を確認する最良の方法は何ですか?


11

私は歴史的に人々が自由に価値を提供するために使用できる分野を持っています。適切な値を持たないレコードを特定して、クリーニングできるようにする必要があります。

私はこのためにSSISを見回してきました。私の傾向は、いくつかのC#コードで正規表現を使用してスクリプトコンポーネントを使用し、その後リダイレクトすることです。それでも、C#に頼らずにこれを行う方法がSSISにあるかどうか疑問に思っていました。

適切な電話番号が記録されていないレコードの数を調べる方法を見つけるのに、あまり運がありませんでした。


サンプルデータはありますか?
GBN、2011

1
ここで回答を確認できますか?
gbn

状況はどうでしたか?このハードルを通過しましたか?
ErikE

回答:


7

一度の作業です。小さなアプリケーションを作成するか、スクリプトを選択し、C#、VB.NET、T-SQLを使用して、すべてのパターンを手動で分析します。たぶん、あなたはこのデータを入力したオペレーターによる一般的なパターンを見つけるでしょう。すべてのパターンのアルゴリズムを追加します。データベース内の実際のデータにパターンを適用します。すべての「間違った」レコードを削除します。

幸運。

追加:

オプションとして、可能であれば、電話番号のデータベースを使用してperson2numberの有効性を確認できます。


私は個人的には「間違った」番号を削除しませんでした...それはあなたが考慮していなかったパターンである可能性があるためです(たとえば、「+」を前に付けた誰か)...デバッグモードで数回実行します。不正な値と見なされるものを報告し、変更を加える前にそれを調べます。
ジョー

@Joe同意:私は2つの列「新しい」値と「古い」値を使用してデータをバックアップしました。それは単なる「強い」言葉だった:)
garik

4

SSIS = SQL Server Integration Service-ほとんどの場合、多くのソースから多くの宛先にデータを統合する方法。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
);

有効であるがクエリでカバーされていないパターンを見つけた場合は、それらを表示されているパーツおよびピースに追加します。2つの部分で一緒にする必要があるものが見つかった場合は、拡張CTE(欠落しているか、Ext1とExt2の組み合わせ)の後にモデル化します。国際番号をサポートする必要があり、それらが異なるパターン(US 3-3-4と一致しない)を持っている場合、適切な国コードを適切なパターンと一致させるために、いくつかの分析と適切な相関が必要になります。たとえば、ブラジルの特定の地域では、これは有効な番号であることを知っています:+55 85 1234-5678(国コード55、市外局番2桁、次に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()アルファベットの各文字。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.