我想将数据从oracle数据库导出到csv,并在varchar列上放置一个数字过滤器。它认为ORA:01722错误。请建议 loc是一个varchar列 它不是选择所有的数据 检查计数,给出ORA:01722错误 导出结果时出错

我想将数据从oracle数据库导出到csv,并在varchar列上放置一个数字过滤器。它认为ORA:01722错误。请建议 loc是一个varchar列 它不是选择所有的数据 检查计数,给出ORA:01722错误 导出结果时出错,oracle,type-conversion,export-to-csv,data-conversion,ora-01722,Oracle,Type Conversion,Export To Csv,Data Conversion,Ora 01722,根据评论编辑: loc包含小于300、大于400和字母数字的值,如“GT”、“3KT1”您当前的查询正在尝试将varchar与数字进行比较。因此,它尝试将varchar动态转换为一个数字。这称为隐式转换 你应该让它比较一个varchar和一个varchar 使用单引号以便与varchar进行比较,而不是与数字进行比较 Select count(*) from table where loc between 300 to 400. 然后去阅读隐式转换 根据问题的更新,此列是合法的varchar

根据评论编辑:


loc包含小于300、大于400和字母数字的值,如“GT”、“3KT1”

您当前的查询正在尝试将varchar与数字进行比较。因此,它尝试将varchar动态转换为一个数字。这称为隐式转换

你应该让它比较一个varchar和一个varchar

使用单引号以便与varchar进行比较,而不是与数字进行比较

Select count(*) from table where loc between 300 to 400. 
然后去阅读隐式转换

根据问题的更新,此列是合法的varchar,不应转换为数字数据类型

但是,您确实需要确定是否在同一列中错误地存储了不同类型的数据

loc
是一个varchar列。
[来自注释]Loc列具有类似于GJ、3KT1的字符类型值

LOC
包含不能转换为数字的值。这很重要,因为WHERE子句谓词定义为数字,所以Oracle对查询应用隐式的
到\u number(loc)
。这就是为什么使用正确的数据类型是最佳实践:它现在对您没有帮助,但请吸取教训,并使用数字列来表示数字数据

同时,您有几个选项来处理您的劣质数据模型

如果您有幸使用Oracle 12c R2,您可以使用新的
VALIDATE_CONVERSION()
函数排除不能转换为数字的
loc

如果您使用的是Oracle的早期版本,则可以构建自己的功能:

Select count(*) from table where loc between '300' to '400'
最弱的选择是将谓词强制转换为字符串<代码>其中loc在“300”到“400”之间将包括
'3000'
'4'
以及您可能不想要的各种其他值


这里是。

Hello Sahiba,您应该使用
number/integer
类型的列来存储数字,而不是
varchar
varchar2
,因为这必然会产生问题。另外,您知道表的
varchar2
列的任何行中都有非数字字符吗?在运行/查找此查询之前,请检查并尝试解决此问题。您好,Kaushik,Loc列的char类型值也与GJ、3KT1等类似。因此,Varchar2作为列类型。那么您希望查询排除哪些值?
'40'
应该在里面还是在外面?
'3000'
?值小于300,大于400,字母数字loc如'GT','3KT1'
create or replace function is_number
    (p_str in varchar2) return number 
is 
    n number;
    rv number;
begin 
    begin
        n := to_number(p_str);
        rv := 1;
    exception
        when invalid_number then
             rv := 0;
    end;
    return rv;
end;