Как отформатировать / очистить исходные данные для импорта в SQL SSN и телефонные номера серверов - PullRequest
0 голосов
/ 19 июня 2020

Из-за того, что моя база данных хранит отформатированные данные для SSN и телефонных номеров, мне нужны методы, чтобы сначала принять входящие данные независимо от их форматирования и отформатировать их в соответствии с тем, как моя база данных хранит данные в этих полях. Данные, для которых я выполняю миграцию, временно импортируются приложением конечным пользователем из внешнего приложения в таблицу Temp для последующего рефакторинга и обработки для INSERT в моей клиентской базе данных.

У меня проблемы работа с данными без регулярных выражений. Как выполнить такие задачи sh DML на сервере SQL? Желаемый результат для двух моих типов данных ниже. Мне не удается получить исходные данные в этих форматах вывода.

Требуемый формат вывода для хранения данных для вставки

SSN: 123-45-6789

SSN: ЕСЛИ 8 символов, затем введите ноль в начале

SSN: ЕСЛИ меньше 8 символов, затем введите знак вопроса '?' ... ??? - ?? - 1234 (Don ' t спросите)

Телефоны: 123-456-7890

Образец кода

WITH fakeCSVData AS
(
    SELECT '111223333' AS SSN, '(444) 4444444'  AS Phone UNION ALL
    SELECT '211222121' AS SSN, '101 232-4545'   AS Phone UNION ALL
    SELECT '12334556'  AS SSN, '(191) 330-4345' AS Phone UNION ALL
    SELECT '41531'     AS SSN, '(039) 084-8309' AS Phone UNION ALL
    SELECT '220981278' AS SSN, '(298) 372-9234' AS Phone UNION ALL
    SELECT '222013450' AS SSN, '(78) 909-7790'  AS Phone UNION ALL
    SELECT '123456789' AS SSN, '(717)_272-7277' AS Phone UNION ALL
    SELECT '113344556' AS SSN, '210-973-2123'   AS Phone UNION ALL
    SELECT '808768252' AS SSN, '(219) 362-1895' AS Phone UNION ALL
    SELECT '3456'      AS SSN, '895 536-5356'   AS Phone UNION ALL
    SELECT '204874556' AS SSN, '(909) 544-9124' AS Phone UNION ALL
    SELECT '80832934'  AS SSN, '0271932132'     AS Phone


)

SELECT 


    CASE WHEN LTRIM(RTRIM(csv.ssn))           LIKE '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' THEN LTRIM(RTRIM(csv.ssn))
            WHEN LTRIM(RTRIM(csv.ssn))          LIKE '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]'      THEN RIGHT( REPLICATE('0', 1) + LTRIM(RTRIM( csv.ssn )), 11)
            WHEN LTRIM(RTRIM(csv.ssn))          LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'   THEN SUBSTRING(LTRIM(RTRIM(csv.ssn)),1,3) + '-' + SUBSTRING(LTRIM(RTRIM(csv.ssn)),4,2) + '-' + SUBSTRING(LTRIM(RTRIM(csv.ssn)),6,4)
            WHEN LTRIM(RTRIM(csv.ssn))          LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'        THEN RIGHT( REPLICATE('0', 1) + LTRIM(RTRIM( SUBSTRING(LTRIM(RTRIM(csv.ssn)),1,2) + '-' + SUBSTRING(LTRIM(RTRIM(csv.ssn)),3,2) + '-' + SUBSTRING(LTRIM(RTRIM(csv.ssn)),5,4) )), 11)
            WHEN RIGHT(LTRIM(RTRIM(csv.ssn)),4) LIKE '%[0-9][0-9][0-9][0-9]'                           THEN '???-??-' + RIGHT(LTRIM(RTRIM(csv.ssn)),4)
      END AS SocSecNo
    , NullIf(LEFT( REPLACE( LTRIM(RTRIM( REPLACE(REPLACE(csv.Phone, ')', ''), '(', '') )), ' ' , '-') , 12), '') AS Phone


FROM fakeCSVData csv

Текущий вывод образца кода

SocSecNo    | Phone
--------------------------
111-22-3333 | 444-4444444
211-22-2121 | 101-232-4545
012-33-4556 | 191-330-4345
???-??-1531 | 039-084-8309
220-98-1278 | 298-372-9234
222-01-3450 | 78-909-7790
123-45-6789 | 717_272-7277
???-??-4556 | 210-973-2123
808-76-8252 | 219-362-1895
???-??-3456 | 895-536-5356
204-87-4556 | 909-544-9124
080-83-2934 | 0271932132

Я все время думаю, что если бы у меня был простой способ сначала удалить все нечисловые c символы из входящих исходных данных, я мог бы просто отформатировать строку, как мне нужно он должен быть отформатирован ... но я не нахожу никаких SQL собственных функций сервера, которые бы это делали.

1 Ответ

1 голос
/ 19 июня 2020

Немного некрасиво, но, возможно, это поможет

WITH fakeCSVData AS
(
    SELECT '111223333' AS SSN, '(444) 4444444'  AS Phone UNION ALL
    SELECT '211222121' AS SSN, '101 232-4545'   AS Phone UNION ALL
    SELECT '12334556'  AS SSN, '(191) 330-4345' AS Phone UNION ALL
    SELECT '41531'     AS SSN, '(039) 084-8309' AS Phone UNION ALL
    SELECT '220981278' AS SSN, '(298) 372-9234' AS Phone UNION ALL
    SELECT '222013450' AS SSN, '(78) 909-7790'  AS Phone UNION ALL
    SELECT '123456789' AS SSN, '(717)_272-7277' AS Phone UNION ALL
    SELECT '113344556' AS SSN, '210-973-2123'   AS Phone UNION ALL
    SELECT '808768252' AS SSN, '(219) 362-1895' AS Phone UNION ALL
    SELECT '3456'      AS SSN, '895 536-5356'   AS Phone UNION ALL
    SELECT '204874556' AS SSN, '(909) 544-9124' AS Phone UNION ALL
    SELECT '80832934'  AS SSN, '0271932132'     AS Phone
)

Select NewSSN = format(try_convert(bigint,SSN),choose(len(SSN)
                                               ,'???-??-???0'
                                               ,'???-??-??00'
                                               ,'???-??-?000'
                                               ,'???-??-0000'
                                               ,'???-?0-0000'
                                               ,'???-00-0000'
                                               ,'??0-00-0000'
                                               ,'?00-00-0000'
                                               ,'000-00-0000') )
      ,NewPhn = format(try_convert(bigint,Phn),choose(len(Phn)
                                               ,'???-???-???0'
                                               ,'???-???-??00'
                                               ,'???-???-?000'
                                               ,'???-???-0000'
                                               ,'???-??0-0000'
                                               ,'???-?00-0000'
                                               ,'???-000-0000'
                                               ,'??0-000-0000'
                                               ,'?00-000-0000'
                                               ,'000-000-0000') )
 From fakeCSVData A
 Cross Apply ( values (  replace(
                         replace(
                         replace(
                         replace(
                         replace(Phone,' ','') 
                         ,'(','')
                         ,')','')
                         ,'-','')
                         ,'_','')
                      )
             ) B(Phn)

Возвращает

enter image description here

EDIT

Вы можете заметить, что CROSS APPLY очищает строку PHONE. Это может потребовать некоторого обслуживания или даже UDF для удаления нечисловых c значений.

...