Apa cara terbaik untuk mengetahui berapa banyak catatan yang tidak memiliki nomor telepon yang tepat di SQL Server?

11

Saya memiliki bidang yang secara historis dapat digunakan orang untuk secara bebas memberikan nilai. Saya perlu mengidentifikasi catatan yang tidak memiliki nilai yang sesuai sehingga saya dapat membersihkannya.

Saya sudah mencari-cari di SSIS untuk ini. Kecenderungan saya adalah menggunakan komponen skrip dengan ekspresi regex dalam beberapa kode C #, diikuti dengan pengalihan. Namun, saya bertanya-tanya apakah ada cara di SSIS untuk melakukan ini tanpa menggunakan C #.

Saya belum beruntung menemukan cara untuk mengetahui berapa banyak catatan yang tidak memiliki nomor telepon yang sesuai.

jujur
sumber
Apakah Anda memiliki data sampel?
gbn
1
Bisakah Anda meninjau jawabannya di sini?
gbn
Bagaimana keadaannya? Apakah Anda melewati rintangan ini?
ErikE

Jawaban:

7

Ini adalah tugas satu kali. Tulis aplikasi kecil atau cukup pilih skrip, gunakan C #, VB.NET, T-SQL ... dan analisis semua pola secara manual. Mungkin Anda akan mengetahui pola umum oleh operator yang memasukkan data ini. Tambahkan algoritma untuk setiap pola. Terapkan pola Anda ke data nyata dalam database. Hapus semua catatan "salah".

Keberuntungan.

TAMBAH:

Sebagai opsi, Anda dapat menggunakan basis data nomor telepon untuk memeriksa validitas person2number jika memungkinkan.

garik
sumber
Saya pribadi tidak akan menghapus angka 'salah' ... karena ini mungkin merupakan pola yang belum Anda pertimbangkan (misalnya, seseorang memberinya awalan dengan '+') ... jalankan beberapa kali dalam mode debugging di mana itu melaporkan apa yang dianggap sebagai nilai buruk, dan memeriksanya sebelum Anda membuatnya melakukan modifikasi.
Joe
@Joe setuju: Saya menggunakan dua kolom nilai "baru" dan "lama" untuk mencadangkan data. Itu hanya kata "kuat" :)
garik
4

SSIS = SQL Server Integration Service - sebagian besar cara mengintegrasikan data dari banyak sumber ke banyak tujuan. Sesuatu seperti mesin untuk mengambil data dari excel / csv / text .. file lain apa yang terlintas dalam pikiran .. dan memindahkannya ke database. Atau sebaliknya.

Tetapi untuk benar-benar memilih dan memanipulasi data Anda masih bisa / harus menggunakan T-SQL.

Dari yang saya tahu T-SQL tidak memiliki komponen regex untuk membantu Anda, jadi Anda akan diminta untuk menggunakan .NET assembly untuk melakukannya.

Marian
sumber
1

Anda bisa mendapatkan perkiraan cepat melalui klausa WHERE berikut karena nomor telepon tidak boleh memiliki karakter alfa ... kecuali Anda mengizinkan nomor fonetis, mis. 1-800-ANT-FARM.

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

Anda tidak dapat melakukan regex kompleks menggunakan LIKE , tetapi Anda bisa mendapatkan perkiraan yang dekat.

Tes saya:

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]%'
Eric Humphrey - lotahelp
sumber
1

Itu tergantung apa yang dapat diterima atau tidak dalam nomor telepon

Ini memberi Anda semua nilai yang bukan 100% numerik dengan menggunakan TIDAK dalam pola pencarian

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

Tetapi jika Anda mengizinkan -atau (000)lebih rumit: tolong minta sampel data

gbn
sumber
0

Coba sesuatu seperti ini:

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

Jika Anda menemukan pola yang valid tetapi tidak tercakup oleh permintaan, tambahkan mereka ke bagian-bagian dan potongan-potongan yang ditunjukkan. Jika Anda menemukan sesuatu yang perlu disatukan dalam dua bagian, maka model setelah CTE Ekstensi (yang hilang atau kombinasi dari Ext1 dan Ext2). Jika Anda perlu mendukung angka internasional, dan mereka memiliki pola yang berbeda (tidak cocok dengan AS 3-3-4) maka Anda akan memerlukan beberapa analisis dan korelasi yang tepat untuk membuat kode negara yang tepat cocok dengan pola yang tepat. Misalnya, saya tahu bahwa di beberapa bagian Brasil, ini adalah angka yang valid: +55 85 1234-5678 (kode negara 55, kode area dua digit, kemudian pola 4-4).

Teknik lain untuk membantu Anda menganalisis data Anda adalah ini:

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;

Ini dapat membantu Anda memahami seperti apa data Anda dengan mengabaikan perbedaan nomor telepon aktual antara setiap baris dan hanya memperhatikan pengaturan dan jumlah digit. Jika ada banyak karakter alfa, cobalah untuk mulai mengganti pola yang valid (seperti "ext") dengan nilai yang tidak ditemukan dalam daftar, sehingga Anda dapat menciutkan sisa input palsu menjadi sesuatu yang dapat dianalisis dengan serupa Replace()untuk setiap huruf dalam alfabet.

ErikE
sumber