Удаление нецифровых символов - SQL0171 Аргумент функции TRANSLATE недействителен - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь извлечь первые десять цифр телефонного номера, заканчивающиеся 10-значным (или менее) номером.Мне нужно использовать белый, а не черный список из-за использования специальных символов.например, "á (123) 555-4567 Toll Free: á (891) 0" должно стать 1235554567.

Я пытаюсь использовать https://stackoverflow.com/a/37685384.

Однако, когда я пытаюсь использоватьthis:

TRANSLATE(SFCONTACT.PHONE,'',TRANSLATE(SFCONTACT.PHONE,'','1234567890',''),'') as clean

Я получаю

Сообщение: [SQL0171] Аргумент 04 функции TRANSLATE недействителен.

В одном из комментариев сказано, чтоиспользование пробелов вместо пустых строк удалило это.Однако для меня попытка:

TRANSLATE(SFCONTACT.PHONE,' ',TRANSLATE(SFCONTACT.PHONE,' ','1234567890',' '),' ') as clean

дает:

Сообщение: [SQL0171] Аргумент 03 функции TRANSLATE недействителен.

Какя могу сделать это?

Запуск AS400 DB2, IBM версия V7R1M0

EDIT (Не уверен, должен ли это быть отдельный Вопрос или нет)

Я попробовал это, как предложено:

SUBSTR(REGEXP_REPLACE(PHONE, '[\D]', ''),1,10) AS MAINPHONE,

И сначала это, казалось, сработало;Мне удалось создать представление, BBICNTMIG

Однако, когда я пытаюсь вставить в таблицу, используя это представление:

INSERT INTO AMMLIBC.BBICONTACT
(COMPANY,CUSNO,SHIPTO,HONORIFICFK,FIRSTNAME,LASTNAME,EMAIL,MAINPHONE,TYPEFK,PROSPECTFK,CREATEDBY,CREATEDAT)
SELECT COMPANY,CUSNO,SHIPTO,HONORIFICFK,FIRSTNAME,LASTNAME,EMAIL,MAINPHONE,TYPEFK,PROSPECTFK,CREATEDBY,CREATEDAT
FROM AMMLIBC.BBICNTMIG

это дает:

Сообщение: [SQL0420] Символ в аргументе CAST недопустим.Причина,,,,: Символ в аргументе для функции CAST был неверным.Восстановление,,: Измените тип данных результата на тот, который распознает символы в аргументе CAST, или измените аргумент, чтобы он содержал допустимое представление значения для типа данных результата.Повторите запрос еще раз.

Если я удаляю телефонные номера из вставки (взяв вместо этого значение по умолчанию, равное null), INSERT завершается успешно, поэтому я знаю, что это номер телефона, вызывающий это.

Тип столбца в таблице назначения - ЧИСЛО (10,0).Я попытался использовать это, но без изменений:

CAST(SUBSTR(REGEXP_REPLACE(PHONE, '[\D]', ''),1,10) AS NUMERIC(10,0)) AS MAINPHONE,

Дополнительная информация:

Я пробовал приводить к типу char перед приведением к числовому.Без изменений.

Я попытался добавить предложение where (оба «mainphone is null» и «mainphone not null» делают это), и сообщение об ошибке меняется на:

Сообщение:[SQL0802] Ошибка преобразования или отображения данных.Причина,,,,: Произошла ошибка типа 6.[...] 6 - Недопустимые числовые данные.

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

Функция TRANSLATE не работает правильно для символов, отличных от ascii.
Вместо этого используйте следующее:

SELECT substr(
--  xmlcast(xmlquery('fn:replace($s, "[^\d]", "")' passing PHONE  as "s") as varchar(4000)) -- DB2 for LUW
regexp_replace(PHONE, '[^\d]', '') -- DB2 for LUW 11.1 & DB2 for IBM i
, 1, 10)
FROM TABLE(VALUES 
  'á(123) 555-4567 Toll Free:á(891) 0'
, 'á(123) 555-'
) SFCONTACT(PHONE);
0 голосов
/ 03 апреля 2019

Используя "FETCH FIRST _ ROWS ONLY" и бинарный поиск, я нашел проблему.

Номер телефона, который он пытался проанализировать, был "ПОЖАЛУЙСТА, ПРОВЕРЬТЕ КОНТАКТ И ПОЧТУ". Который, убирая цифры, превращается в пустую строку ... которая плохо конвертируется в ЦИФРОВУЮ (10,0).

Итак, это решило проблему:

CASE
    WHEN TRIM(REGEXP_REPLACE(PHONE, '[\D]', '')) = '' THEN NULL
    ELSE CAST(SUBSTR(REGEXP_REPLACE(PHONE, '[\D]', ''),1,10) AS NUMERIC(10,0))
END AS MAINPHONE,
0 голосов
/ 03 апреля 2019

Платформа и версия Db2 важны ...

Например, Db2 для i 7.2 дает мне

Причина.,,,,: Параметр 3, указанный в функции TRANSLATE, недопустим для использования с кодом причины 1. Коды причин и их значения следующие:
1 - параметр должен быть строковой константой.
2 - параметр должен быть целочисленной константой.
3 - параметр должен быть числовой константой.
4 - длина параметра слишком велика.
5 - значение параметра выходит за пределы диапазона.
6 - параметр должен быть действительнымCCSID.
7 - Параметр не может быть маркером параметра.
8 - Тип данных параметра не поддерживается встроенной функцией.
9 - Параметр не может ссылаться на столбец с активной маской столбца.так как функция не защищена.
Восстановление.,,: Дополнительную информацию о функциях смотрите в разделе темы Справочник по DB2 для IBM i SQL в категории База данных в книге Информационного центра IBM i, http://www.ibm.com/systems/i/infocenter/.Исправьте параметр, указанный для функции.Попробуйте запрос еще раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...