Из-за того, что моя база данных хранит отформатированные данные для 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 собственных функций сервера, которые бы это делали.