2010-03-26 3 views
5

У меня проблема при преобразовании типа varchar в тип Int в Informix. На самом деле я не знаю, действительно ли значение varchar или нет, которое я хочу преобразовать в INT. Это песочница.Преобразование varchar в числовое значение в Informix

Как пример: Я пытаюсь запустить этот вид

Select telnumber from numbers n 
where Cast(n.telnumber AS INT) between 1234 and 9999 

Я получил эту ошибку: «Character для цифровой ошибки преобразования»

Если я запускаю этот запрос так:

Select telnumber from numbers n where n.telnumber between '1234' and '9999' 

он приносит результаты, но не в том диапазоне, который я определил.

130987 
130710 
130723 

Как я могу преобразовать telnumber в числовое значение и использовать его в «между» 1234 и 9999 диапазон

ответ

0

Я не использую Informix, но это работает для меня в SQL Server:

SELECT telnumber FROM numbers WHERE Abs(n.telnumber) BETWEEN 1234 AND 9999 

Однако вы, вероятно, столкнетесь с проблемами, потому что телефонные номера действительно являются строками и не являются INT, и в конечном итоге любая попытка обработать их как INT будет терпеть неудачу.

2

Ошибка преобразования указывает на то, что некоторые значения в столбце 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 - к сожалению. Тем не менее, нестандартное МАТЧИ оператор позволит вам сделать это:

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]' 

Это простое регулярное выражение, - но «*» представляет собой оболочку глобирование стиль «любая последовательность из нуля или более символов», а не «Звезда Клейна» - «ноль или более повторений предыдущего персонажа».

2

Простой ответ: 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; 

В качестве альтернативы вы могли бы попробовать использовать хранимую процедуру, используя блок «ИСКЛЮЧИТЕЛЬНЫЙ ОТКЛОН»? (Символ для числовой ошибки преобразования - errno 1213).

Дальнейшее чтение по использованию 'ON ИСКЛЮЧЕНИЯ': 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

0

Для меня это сработало:

Select * 
From table1 
where cast(left(field1,7) as numeric) BETWEEN 2128042 and 2128045 
Смежные вопросы