在Informix中将varchar转换为数字

时间:2010-03-26 16:38:58

标签: informix casting

在Informix中将varchar类型转换为Int类型时遇到问题。 实际上我不知道该值是否真的是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”和9999范围之间使用

4 个答案:

答案 0 :(得分: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中不是标准配置 - 遗憾的是。但是,非标准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]'

这是一个简单的正则表达式 - 但'*'是一个shell globbing样式'任何零个或多个字符的序列',而不是Kleene Star'零个或多个前一个字符的重复'。

答案 1 :(得分:2)

简单回答: Informix内置了强制转换,你可以这样使用:

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

此外:

然而,正如Jonathan Leffler先前所指出的,听起来您的数据集包含的值不一定可以转换为整数。 如果是这样,那么这可能不适合您的理想架构? 如果你绝对需要在这里使用非数字字符(例如我怀疑你最终会使用' - ','('或')'),你可以尝试排除与非数字字符匹配的行: / p>

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 :(得分:0)

我不使用Informix,但这在SQL Server中适用于我:

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

但是,您可能会遇到问题,因为电话号码确实是字符串而不是INT,最终任何将它们视为INT的尝试都将失败。

答案 3 :(得分:0)

对我来说,这很有效:

Select *
From table1
where cast(left(field1,7) as numeric) BETWEEN 2128042 and 2128045