【问题标题】:ORA-01722: invalid number errorORA-01722: 无效号码错误
【发布时间】:2018-02-14 14:59:53
【问题描述】:

我在我的 Oracle 客户端中运行下面提到的查询,我得到了

ORA-01722: 无效号码

错误。我知道问题是由于 TAG_VALUE 列的类型为“varchar2”,我将其转换为数字,然后在 where 子句中使用该字段。我曾尝试使用“CAST”功能,但这也无济于事。 如果我使用代码WHERE (P.TAG_VALUE > '100') 忽略最后一个 where 条件运行查询,那么我会得到结果,但包括最后一个 where 子句会给我错误。

 SELECT DISTINCT
      count(P.CREATED_DATETIME)
    FROM
      ( 
      select OUTPUT_TAG_ID,TO_NUMBER(TAG_VAL,'9999.99') AS 
    TAG_VALUE,TAG_VAL_TS,CREATED_DATETIME
    from OV80STG.PRCSD_DATA_OUTPUT_ARCHIVE
    where MODEL_CODE='MDLADV1538'
    AND TAG_VAL <> 'U_Transfer_rate'
      )   P
    WHERE
    (P.TAG_VALUE > '100')

任何建议将不胜感激。谢谢。

【问题讨论】:

  • 去掉(P.TAG_VALUE &gt; '100')处的单引号
  • @Arpit 。你能检查查询SELECT * FROM OV80STG.PRCSD_DATA_OUTPUT_ARCHIVE WHERE REGEXP_LIKE(TAG_VALUE, '[^[:digit:]]') 是否返回任何行吗?就是检查列中是否存在非数字字符
  • 感谢 Jens 的回复,我已经尝试过这样做,但查询仍然返回相同的错误。
  • @Kaushik,感谢您的回复,是的,提到的查询正在返回行
  • @ArpitArora :表示TAG_VALUE 列中有非数字字符。您必须从所有获取的记录中替换它们。

标签: sql oracle


【解决方案1】:

where 中的值周围删除单引号,当它是整数时不需要它们。查询将是这样的:

SELECT DISTINCT
    COUNT(P.CREATED_DATETIME)
FROM
(
    SELECT
        OUTPUT_TAG_ID,
        TO_NUMBER(TAG_VAL, '9999.99') AS TAG_VALUE,
        TAG_VAL_TS,
        CREATED_DATETIME
    FROM OV80STG.PRCSD_DATA_OUTPUT_ARCHIVE
    WHERE MODEL_CODE = 'MDLADV1538'
          AND TAG_VAL <> 'U_Transfer_rate'
) P
WHERE(P.TAG_VALUE > 100);

【讨论】:

  • 感谢@dbajtr 的回复,我已经尝试过这样做,但查询仍然返回相同的错误。
【解决方案2】:

TO_NUMBER 函数返回一个数值,因此,如评论中所述,您不应将其与字符串值进行比较。

【讨论】:

    【解决方案3】:

    我通过在子查询中包含外部 where 子句解决了这个问题,然后我得到了所需的结果,没有任何错误。

    【讨论】:

      猜你喜欢
      • 2012-09-14
      • 1970-01-01
      • 2019-08-09
      • 2021-05-03
      • 2023-03-15
      • 2020-05-09
      • 1970-01-01
      相关资源
      最近更新 更多