我想将数据从 oracle 数据库导出到 csv,并且我在 varchar 列上放置了一个数字过滤器.它如何解决ORA:


Select count(*) from table where loc between 300 to 400. 
  1. loc是瓦尔查尔柱。
  2. 它没有选择所有数据
  3. 检查计数,给出 ORA :01722 错误
  4. 导出结果时出现错误。

从评论编辑:

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

loc是一个

varchar列。
[来自评论]Loc 列具有字符类型值,也像 GJ、3KT1

LOC包含不可转换为数字的值。这很重要,因为 WHERE 子句谓词定义为数字,因此 Oracle 对查询应用隐式to_number(loc)。这就是为什么使用正确的数据类型是最佳实践的原因:它现在对你没有帮助,但请吸取教训,并对数字数据使用 NUMBER 列。

同时,您有多种选择来处理笨拙的数据模型。

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

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

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;

最弱的选项是将谓词强制转换为字符串。where loc between '300' to '400'将包括'3000''4'和您可能不想要的各种其他值。

这是一个LiveSQL演示(需要免费的Oracle Technet帐户,唉(。

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

你应该让它将瓦尔查尔与瓦尔查尔进行比较。

使用单引号,以便您比较的是 varchars,而不是数字

Select count(*) from table where loc between '300' to '400'

然后去阅读隐式转换

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

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

最新更新