我已经搜索并看到了一些类似的问题,但没有一个能解决我的问题。我的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时出错。
答案 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))