SQL Server'da kaç kaydın uygun bir telefon numarasına sahip olmadığını bulmanın en iyi yolu nedir?


11

İnsanların tarihsel olarak özgürce değer vermek için kullanabileceği bir alanım var. Onları temizleyebilmem için uygun bir değeri olmayan kayıtları tanımlamam gerekiyor.

Bunun için SSIS'ye bakıyordum. Eğilimim, bazı C # kodlarında regex ifadesi olan bir komut dosyası bileşeni ve ardından bir yönlendirme kullanmaktır. Yine de, SSIS'de bunu C # 'a başvurmadan yapmanın bir yolu olup olmadığını merak ediyordum.

Kaç kaydın uygun telefon numaralarına sahip olmadığını bulmak için bir yol bulma şansım olmadı.


Örnek verileriniz var mı?
gbn

1
Lütfen cevapları burada inceleyebilir misiniz?
gbn

İşler nasıl geçti? Bu engeli geçtin mi?
ErikE

Yanıtlar:


7

Tek seferlik bir görevdir. Küçük bir uygulama yazın veya sadece komut dosyası seçin, C #, VB.NET, T-SQL ... kullanın ve tüm kalıpları manuel olarak analiz edin. Belki de bu verileri giren operatörler tarafından ortak kalıplar bulabilirsiniz. Her desen için bir algoritma ekleyin. Desenlerinizi veritabanındaki gerçek verilere uygulayın. Tüm "yanlış" kayıtları kaldırın.

Şans.

KATMA:

Seçenek olarak, mümkünse person2numallerinin geçerliliğini kontrol etmek için telefon numaraları veritabanını kullanabilirsiniz.


Şahsen 'yanlış' sayıları kaldırmazdım ... dikkate almadığınız bir desen olabileceği için (örneğin, '+' ile ön ek olan biri) ... hata ayıklama modunda birkaç kez çalıştırın neyin kötü bir değer olarak değerlendirdiğini rapor eder ve herhangi bir değişiklik yapmadan önce ona bakar.
Joe

@Joe katılıyorum: Verileri yedeklemek için iki sütun "yeni" değer ve "eski" bir sütun kullandım. Sadece "güçlü" kelimeydi :)
garik

4

SSIS = SQL Server Entegrasyon Hizmeti - çoğunlukla birçok kaynaktan verileri birçok hedefe entegre etmenin bir yoludur. Bir motor gibi bir şey excel / csv / text veri almak .. başka bir dosya akla geliyor .. ve bir veritabanına taşımak. Ya da tam tersi.

Ancak aslında verileri seçmek ve işlemek için yine de T-SQL'i kullanmanız gerekir.

Bildiğim kadarıyla, T-SQL'in size yardımcı olacak herhangi bir regex bileşeni yoktur, bu nedenle bunu yapmak için bir .NET derlemesi kullanmanız gerekir.


1

Telefon numaralarının alfa karakterleri olmaması gerektiğinden aşağıdaki WHERE yan tümcesiyle hızlı bir tahmin alabilirsiniz ... fonetik numaralara izin vermedikçe, ör. 1-800-ANT TARLA.

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

LIKE kullanarak karmaşık normal ifadeyi yapamazsınız , ancak yakın bir yaklaşım elde edebilirsiniz.

Benim testim:

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

Bir telefon numarasında neyin kabul edilebilir olduğuna veya neye bağlı olmadığına bağlıdır

Bu, arama modelinde NOT kullanarak% 100 sayısal olmayan tüm değerleri verir

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

Ancak izin verirseniz -veya (000)daha karmaşıksa: lütfen örnek verilere ihtiyacınız var


0

Bunun gibi bir şey deneyin:

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
);

Geçerli ancak sorgu tarafından kapsanmayan desenler bulursanız, bunları gösterilen parçalara ve parçalara ekleyin. İki bölümde birlikte olması gereken bir şey bulursanız, uzantı CTE'sinden sonra (eksik veya Ext1 ve Ext2'nin bir kombinasyonu) modelleyin. Uluslararası numaraları desteklemeniz gerekiyorsa ve farklı kalıpları varsa (ABD 3-3-4 ile eşleşmiyor), doğru ülke kodlarının doğru kalıplarla eşleşmesi için bazı analizlere ve uygun korelasyona ihtiyacınız olacaktır. Örneğin, Brezilya'nın bazı bölgelerinde bu geçerli bir sayı olduğunu biliyorum: +55 85 1234-5678 (ülke kodu 55, alan kodu iki basamak, sonra 4-4 desen).

Verilerinizi analiz etmenize yardımcı olacak başka bir teknik şudur:

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;

Bu, her satır arasındaki gerçek telefon numarası farklarını göz ardı ederek ve yalnızca rakamların düzenine ve sayısına dikkat ederek verilerinizin nasıl olduğunu anlamanıza yardımcı olabilir. Çok fazla alfa karakter varsa, geçerli kalıpları ("ext" gibi) listede bulunmayan bir değerle değiştirmeye başlayın, böylece sahte girdinin geri kalanını benzer bir yöntemle analiz edilebilecek bir şeyle daraltabilirsiniz. Replace()alfabedeki her harf için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.