【问题标题】:Convert varchar to numeric in Informix在 Informix 中将 varchar 转换为数字
【发布时间】:2011-02-01 06:30:57
【问题描述】:

在 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

如何将电话号码转换为数值并在“介于”1234 和 9999 范围内使用它

【问题讨论】:

    标签: informix casting


    【解决方案1】:

    对我来说,这很有效:

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

    【讨论】:

      【解决方案2】:

      简单的答案: Informix 内置了强制转换,您可以像这样使用它:

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

      进一步:

      但是,正如 Jonathan Leffler 之前指出的那样,听起来您的数据集包含的值不一定可以转换为整数。 如果是这样,那么也许这不是您的理想模式? 如果您绝对需要在此处包含非数字字符(例如,我怀疑您最终会得到“-”、“(”或“)”之一),您可以尝试排除与非数字字符匹配的行:

      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

      【讨论】:

        【解决方案3】:

        转换错误表明 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 的“前一个字符的零个或多个重复”。

        【讨论】:

          【解决方案4】:

          我不使用 Informix,但这在 SQL Server 中对我有用:

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

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

          【讨论】:

            猜你喜欢
            • 2011-12-31
            • 2018-04-19
            • 2020-10-26
            • 2013-12-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-07-16
            • 2021-09-10
            相关资源
            最近更新 更多