Преобразуйте varchar в числовой в Informix

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

5
задан Jonathan Leffler 26 March 2010 в 20:16
поделиться

3 ответа

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

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

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

0
ответ дан 15 December 2019 в 00:56
поделиться

Ошибка преобразования предполагает, что некоторые значения в столбце 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
ответ дан 15 December 2019 в 00:56
поделиться

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

2
ответ дан 15 December 2019 в 00:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: