TO_NUMBER无效的数字错误

时间:2014-08-14 19:19:51

标签: sql oracle type-conversion

我已经搜索并看到了一些类似的问题,但没有一个能解决我的问题。我的where子句中的TO_NUMBER上的数字错误无效。我读过的一些内容说它可能是由于你将TO_NUMBER放在where子句中的位置引起的,所以我希望有人可以帮我解决这个问题。这是我的查询中的where子句:

WHERE year_sec = TEST.YEAR_SEC_BY_DATE ('F', 0)
   AND (year_sec = '2014F')
    AND ((no_name LIKE '54%' AND user3 IS NOT NULL)
     OR (SUBSTR (no_name, 1, 2) = '52' AND SUBSTR (no_name, 5, 1) = '8')
     OR (no_name LIKE '56%')) 
OR (TO_NUMBER(SUBSTR(year_sec,1,4), '9999') >= 2015)
     AND ((no_name LIKE '543%' AND user3 IS NOT NULL)
      OR (no_name LIKE '523%')
      OR (no_name LIKE '563%'));

year_sec总是4位数,后面跟一个字母,永远不会为空(如果不是那么会有更大的问题)。那么有谁能看出为什么会导致ORA-01722错误?

编辑:删除引号,复制sql时出错。

2 个答案:

答案 0 :(得分:3)

假设错误来自查询中的to_number,而不是来自year_sec_by_date函数或代码中其他位置的无效转换,我通常会打赌Oracle太愚蠢了,不能骗你。在您的数据的某处,您至少有一行year_sec不是4位数后跟一个字母。

找到问题行的一种方法是

CREATE OR REPLACE FUNCTION my_to_number( p_str IN VARCHAR2 )
  RETURN NUMBER
IS
BEGIN
  RETURN to_number( p_str );
EXCEPTION
  WHEN others THEN
    RETURN NULL;
END;

然后

SELECT year_sec, <<other columns>>
  FROM <<your table>>
 WHERE my_to_number( substr( year_sec, 1, 4 )) IS NULL

请注意,如果您的某些行year_sec无效且正被查询中的其他谓词过滤掉,则无法保证Oracle将以任何特定顺序应用谓词。 Oracle可以在查询中的任何其他谓词之前或之后应用to_number

答案 1 :(得分:0)

优化器可以重写您的查询并更改您希望转换发生的位置。检查您期望数字数据的错误字符数据。

SELECT year_sec,
       UPPER(SUBSTR(year_sec,1,4)) AS UPPER_YEAR,
       LOWER(SUBSTR(year_sec,1,4)) AS LOWER_YEAR
  FROM my_table
 WHERE UPPER(SUBSTR(year_sec,1,4)) != LOWER(SUBSTR(year_sec,1,4))

From OraFAQ ORA-01722