Преобразовать varchar в числовой в Informix - PullRequest
5 голосов
/ 26 марта 2010

У меня проблема при преобразовании типа varchar в тип Int в 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

Как преобразовать номер телефона в числовое значение и использовать его в диапазоне от 1234 до 9999

Ответы [ 4 ]

2 голосов
/ 26 марта 2010

Ошибка преобразования указывает на то, что некоторые значения в столбце 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]'

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

2 голосов
/ 07 апреля 2010

Простой ответ: Informix имеет встроенное приведение, которое вы можете использовать так:

SELECT telnumber
FROM   numbers n
WHERE  n.telnumber::integer BETWEEN 1234 AND 9999;

Далее:

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

SELECT telnumber
FROM   numbers n
WHERE  n.telnumber not matches "*[0-9]*"
AND    n.telnumber::integer BETWEEN 1234 AND 9999;

В качестве альтернативы, вы можете попробовать использовать хранимую процедуру, используя блок ON EXCEPTION? (Ошибка преобразования символа в числовое значение - errno 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

0 голосов
/ 02 октября 2015

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

Select *
From table1
where cast(left(field1,7) as numeric) BETWEEN 2128042 and 2128045
0 голосов
/ 26 марта 2010

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

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

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

...