У меня есть проблема при преобразовании varchar типа в Международный тип в Informix. На самом деле я не знаю, действительно ли значение varchar или не, который я хочу преобразовать в INT. Это - система песочницы.
Как Пример: Я пытаюсь выполнить это отчасти
Select telnumber from numbers n
where Cast(n.telnumber AS INT) between 1234 and 9999
Я получил эту ошибку: "Символ к числовой ошибке преобразования"
Если я выполняю этот запрос как это:
Select telnumber from numbers n where n.telnumber between '1234' and '9999'
это приносит набор результатов, но не в диапазоне, который я определил.
130987
130710
130723
Как я могу преобразовать telnumber в числовое значение и использовать его в "между" 1234 и 9 999 диапазонами
Я не использую Informix, но это у меня работает в SQL Server:
SELECT telnumber FROM numbers WHERE Abs(n.telnumber) BETWEEN 1234 AND 9999
Однако вы, вероятно, столкнетесь с проблемами, потому что телефонные номера действительно являются строками, а не INT, и в конечном итоге любая попытка рассматривать их как INT потерпит неудачу.
Ошибка преобразования предполагает, что некоторые значения в столбце telnumber не отформатированы как допустимое целое число - и поэтому вызывают ошибку, которую вы видите при попытке преобразования.
Второй запрос перечисляет дополнительные значения, потому что «123» находится между «10» и «20» при сравнении в виде строк.
Если вы хотите ограничить его 4-значными числами, вы можете использовать:
SELECT telnumber
FROM numbers n
WHERE n.telnumber BETWEEN '1234' AND '9999'
AND LENGTH(n.telnumber) = 4
Это все равно будет включать «1AA2» в результирующий набор.
К сожалению, полная поддержка регулярных выражений (например, PCRE) не входит в стандартную комплектацию IDS. Однако нестандартный оператор MATCHES позволит вам это сделать:
SELECT telnumber
FROM numbers n
WHERE n.telnumber BETWEEN '1234' AND '9999'
AND LENGTH(n.telnumber) = 4
AND n.telnumber MATCHES '[0-9][0-9][0-9][0-9]'
Это простое регулярное выражение, но '*' - это стиль подстановки оболочки 'любая последовательность из нуля или более символов', а не звезда Клини ' ноль или более повторений предыдущего символа '.
Простой ответ: Informix имеет встроенное преобразование типов, которое можно использовать следующим образом:
SELECT telnumber
FROM numbers n
WHERE n.telnumber::integer BETWEEN 1234 AND 9999;
Далее:
Однако, как ранее указывал Джонатан Леффлер , похоже, ваш набор данных содержит значения, которые не обязательно могут быть преобразованы в целые числа. Если это так, то, возможно, это не идеальная схема для ваших целей? Если вам это абсолютно необходимо чтобы здесь были нечисловые символы (например, я подозреваю, что вы получите один из '-', '(' или ')'), вы можете попробовать исключить строки, соответствующие нечисловым символам:
SELECT telnumber
FROM numbers n
WHERE n.telnumber not matches "*[0-9]*"
AND n.telnumber::integer BETWEEN 1234 AND 9999;
В качестве альтернативы, вы могли бы попробовать использовать хранимую процедуру, используя блок ON EXCEPTION? (Ошибка преобразования символа в число - номер ошибки 1213).
Дополнительная литература по использованию «ON EXCEPTION»: http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls946. htm
Дополнительная литература по определению и использованию хранимых процедур: http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls906 .htm