我有一个查询,我正在尝试编写/运行...如果我进一步使用WHERE过滤器并添加" rownum<我可以让它返回结果100&#34 ;.我可以继续增加它,它会扩展结果..但是,如果我删除它并让它完整运行它会抛出一个oracle sql错误:
数据库错误:511 - ORA-01722:无效数字
非常感谢任何帮助!
SELECT inventory_view.prtnum, inventory_view.lotnum, inventory_view.expire_dte, inventory_view.mandte, to_number(inventory_view.expire_dte - inventory_view.mandte) As "DELTA", SUBSTR(inventory_view.age_pflnam, 1, 3) As "Age Profile", to_number((inventory_view.expire_dte - inventory_view.mandte)) - to_number(SUBSTR(inventory_view.age_pflnam, 1, 3)) AS "DELTA 2", lst_arecod, prt_client_id
FROM inventory_view
WHERE inventory_view.prtnum = inventory_view.prtnum
AND lst_arecod <> 'SHIP'
AND prt_client_id = 'TEST'
答案 0 :(得分:0)
您收到错误,因为某个特定行和列的to_number转换之一失败。在您点击该行之前,您不会收到错误,这解释了and rownum < ...
成功运行的原因。
要确定错误值,您可以尝试以下查询,该查询测试正在转换的列的值,以用于非数字值。
SELECT
inventory_view.prtnum,
inventory_view.lotnum,
inventory_view.expire_dte,
inventory_view.mandte,
to_number(inventory_view.expire_dte - inventory_view.mandte) As "DELTA",
SUBSTR(inventory_view.age_pflnam, 1, 3) As "Age Profile",
to_number((inventory_view.expire_dte - inventory_view.mandte)) - to_number(SUBSTR(inventory_view.age_pflnam, 1, 3)) AS "DELTA 2",
lst_arecod,
prt_client_id
SELECT inventory_view.*
FROM inventory_view
WHERE lst_arecod <> 'SHIP'
AND prt_client_id = 'TEST'
AND
(LOWER(inventory_view.expire_dte) <> UPPER(inventory_view.expire_dte)
OR LOWER(inventory_view.mandte) <> UPPER(inventory_view.mandte)
OR LOWER(SUBSTR(inventory_view.age_pflnam, 1, 3)) <> UPPER(SUBSTR(inventory_view.age_pflnam, 1, 3))
);
此外,您可以在原始查询中排除这些非数字值,如下所示:
SELECT
inventory_view.prtnum,
inventory_view.lotnum,
inventory_view.expire_dte,
inventory_view.mandte,
to_number(inventory_view.expire_dte - inventory_view.mandte) As "DELTA",
SUBSTR(inventory_view.age_pflnam, 1, 3) As "Age Profile",
to_number((inventory_view.expire_dte - inventory_view.mandte)) - to_number(SUBSTR(inventory_view.age_pflnam, 1, 3)) AS "DELTA 2",
lst_arecod,
prt_client_id
SELECT inventory_view.*
FROM inventory_view
WHERE lst_arecod <> 'SHIP'
AND prt_client_id = 'TEST'
AND LOWER(inventory_view.expire_dte) = UPPER(inventory_view.expire_dte)
AND LOWER(inventory_view.mandte) = UPPER(inventory_view.mandte)
AND LOWER(SUBSTR(inventory_view.age_pflnam, 1, 3)) = UPPER(SUBSTR(inventory_view.age_pflnam, 1, 3));
请注意,inventory_view.prtnum = inventory_view.prtnum
条件已被删除,因为它始终为TRUE。
答案 1 :(得分:-1)
抱歉,这不是您问题的直接答案,但如果您仍然需要帮助,我的类似问题的解决方案可能会给您一些想法。 这里我减去两个日期以显示已过去的小时数。 ,to_char(PEH.HOSP_DISCH_TIME-PEH.HOSP_ADMSN_TIME,&#39; 99.99&#39;)* 24作为LOS_hrs 一个帐户导致ora-01722。 这个数字对于99.99&#39;来说太大了。改为&#39; 999.99&#39;做了伎俩。 然而,我仍然感到困惑,因为结果超过了1000。