Sql ORA-01722:无效数字错误

Sql ORA-01722:无效数字错误,sql,oracle,Sql,Oracle,我正在我的Oracle客户端中运行下面提到的查询,并且 ORA-01722:无效号码 错误。我知道问题是由于TAG_VALUE列的类型为varchar2,我将其转换为number,然后在where子句中使用该字段。我尝试过使用CAST函数,但也没有帮助。 如果我运行查询时忽略了最后一个where条件,代码where P.TAG_VALUE>'100',那么我将得到结果,但包括最后一个where子句会产生错误 SELECT DISTINCT count(P.CREATED_DATET

我正在我的Oracle客户端中运行下面提到的查询,并且

ORA-01722:无效号码

错误。我知道问题是由于TAG_VALUE列的类型为varchar2,我将其转换为number,然后在where子句中使用该字段。我尝试过使用CAST函数,但也没有帮助。 如果我运行查询时忽略了最后一个where条件,代码where P.TAG_VALUE>'100',那么我将得到结果,但包括最后一个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')

如有任何建议,将不胜感激。谢谢。

从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);

从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);

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

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

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

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

删除p.TAG\u值处的单引号>“100”@Arpit。您是否可以检查查询是否从OV80STG.PRCSD_DATA_OUTPUT_ARCHIVE中选择*FROM REGEXP_LIKETAG_VALUE,[^[:digit:]]返回任何行?。这是为了检查列中是否存在非数字字符谢谢你回复Jens,我已经尝试过了,但是查询仍然返回相同的错误。@Kaushik,谢谢你的回复,是的,提到的查询正在返回rows@ArpitArora:表示“标记值”列中有非数字字符。您必须从获取的所有记录中替换它们。删除P.TAG_VALUE>'100'@arbit处的单引号。您是否可以检查查询是否从OV80STG.PRCSD_DATA_OUTPUT_ARCHIVE中选择*FROM REGEXP_LIKETAG_VALUE,[^[:digit:]]返回任何行?。这是为了检查列中是否存在非数字字符谢谢你回复Jens,我已经尝试过了,但是查询仍然返回相同的错误。@Kaushik,谢谢你的回复,是的,提到的查询正在返回rows@ArpitArora:表示“标记值”列中有非数字字符。您必须从获取的所有记录中替换它们。感谢您回复@dbajtr,我尝试过这样做,但查询仍返回相同的错误。感谢您回复@dbajtr,我尝试过这样做,但查询仍返回相同的错误。