Есть ли встроенная функция для проверки буквенных или числовых данных в Informix 7.3? - PullRequest
1 голос
/ 30 марта 2011

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

Например, я пытаюсь проверить поле телефонного номера, чтобы в нем были только номера и соответственно с ним работать:

Учитывая эту таблицу с типом поля телефона, являющимся char(12):

id      name        phone
5164      Cheese      973-153-5149
8843      Queso       (201)8011830
8356      Formaggio   2129182943
8938      Ost         ext.21438
3852      Ser         973-15-1549

Я хочу сделать что-то вроде этого:

SELECT  CASE    WHEN    (ISALPHA((TRIM(REPLACE((REPLACE((REPLACE((REPLACE((REPLACE(phone,'-','')),'(','')),')','')),' ','')),'.','')))))
                THEN    'has alpha chars'
                WHEN    (LENGTH((TRIM(REPLACE((REPLACE((REPLACE((REPLACE((REPLACE(phone,'-','')),'(','')),')','')),' ','')),'.','')))) NOT IN (10,11))
                THEN    'wrong length'
                WHEN    (phone IN ('',' ',NULL)))
                THEN    'phone is blank'
                ELSE    (TRIM(REPLACE((REPLACE((REPLACE((REPLACE((REPLACE(phone,'-','')),'(','')),')','')),' ','')),'.','')))
        END     phone
FROM    given_table;

По сути, я пытаюсь удалить любые символы -, (, ), , . из номера телефона, обрезать полученный результат, проверить его длину на 10 или 11 длина символов, и убедитесь, что в данных нет альфа-символов после всех замен и обрезки. (Если вы чувствуете, что что-то не так с тем, как я собираюсь заменить и обрезать, я открыт для предложений по этому аспекту. Regex?)

Конечный результат, который я хотел бы получить:

phone
9731535149
2018011830
2129182943
has alpha chars
wrong length

Я прочитал одно решение (Oracle), в котором предлагается использовать комбинацию LENGTH, TRIM и TRANSLATE, но TRANSLATE не поддерживается для Informix 7.3


* Обратите внимание - я напишу свою собственную функцию, если ее не существует, поэтому, пожалуйста, не предлагайте это в качестве ответа. Я просто хочу знать, есть ли какие-либо встроенные способы сделать это.
Джонатан Леффлер на помощь?

Ответы [ 2 ]

3 голосов
/ 30 марта 2011

Вот способ, который я нашел, чтобы проверить альфа. Это обходной путь, но я думаю, что пока он надежен.

SELECT phone FROM given_table WHERE UPPER(phone)<>LOWER(phone);

Ссылка: http://www.geekinterview.com/question_details/34549 (см. Ответ пользователя "amarnathtnl" чуть более чем на полпути вниз по странице)

1 голос
/ 27 марта 2014

Надежно работает:

CREATE FUNCTION to_int(alpha VARCHAR(16)) RETURNING INT;
  DEFINE n INT;
  ON EXCEPTION IN (-1213) RETURN NULL; END EXCEPTION;
  LET n = alpha;
  RETURN n;
END FUNCTION;

Возвращает число NULL.

...