在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范围之间使用
答案 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