我想将数据从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;