【问题标题】:Error on query with "Replace"使用“替换”查询时出错
【发布时间】:2014-07-18 12:42:03
【问题描述】:

我在 oracle 服务器上出现错误,但我不明白为什么无法正常工作。 我用的是软件oracle sql developer。

查询是:

SELECT * FROM TestView WHERE REPLACE(TestView.Row2, '.', ',') > 0 ;

TestVue.Row2 中的值:'46.08','-46.47','1084.05','66500',... "TestView" 是检查返回没有空值的行的视图

当我执行查询时,我总是有一个错误提示:

ORA-01722: 无效号码 01722. 00000 - “无效号码” *原因: *行动:

感谢您的帮助

分区

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您的表中有一行,无法解析为数字格式。很可能是一个空白列。

    SELECT * FROM TestVue WHERE TestVue.Row2 IS NULL ;
    

    【讨论】:

    • 但视图“TestVue”检查 Row2 是否不为空。无论如何,我已经使用您的查询来检查该行是否为空,并且我没有空列。我用你的问题编辑我的帖子负责人
    • 是的,但是空白和 NULL 是不同的。看看你是否可以使用类似@Gordon Linoff 的查询找到坏行
    • 这不会返回任何内容。 NULL and the empty string are identical in Oracle 并且您不能将 NULL 与相等性进行比较。
    • 好的,但是您是否投反对票,因为这回答了问题。是的,您的链接显示 NULL 和 '' 在 oracle 中是等效的。对我来说没有意义,但也不在这里也不在那里。
    • 更新为使用 IS NULL :) 刚刚确认 "= '' " 如果仅 VARCHAR2,则不会返回空白行。愚蠢的神谕。
    【解决方案2】:

    使用 NVL 函数避免 null 字段导致的错误,并使用 TO_NUMBER 函数在与零比较之前转换为数字

    SELECT * FROM TestView WHERE TO_NUMBER(REPLACE(NVL(TestView.Row2,'0'), '.', ',')) > 0 ;
    

    【讨论】:

    • 为什么你认为这会比原来的效果更好?如果你只是建议他试试看是否有效,那不是答案。
    • 这解决了无效数字错误,考虑到该字段不为空。如果没有,也可能需要使用 NVL 函数: Select * from TestView where to_number(Replace(NVL(Row2,'0'),'.',',')) > 0
    【解决方案3】:

    您应该能够找到类似以下内容的行:

    select Row2
    from TestVuw
    where length(trim(translate(Row2, '+-.,0123456789', ' '))) = 0
    

    当然,这允许多个+-.,。可以使用正则表达式对其进行进一步细化,但这通常可以找到不好的。

    【讨论】:

    • 当我使用您的查询时出现此错误:ORA-00920:无效的关系运算符 00920。00000 -“无效的关系运算符” *原因:*操作:行错误:1 列:110跨度>
    • @Zoners 。 . .这已经解决了。 (在所有这些字符串操作之后需要进行比较;)
    • 我没有错误,但是查询没有返回结果。如果我在 "Row2" 中有值 "46.07" ,并且我尝试使用 ">0" 而不是 "=0" 进行查询,我没有结果。感谢您的帮助
    • @Zoners 。 . .嗯。也许你有两个小数点。你可以找value like '%.%.%'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多