0
Select count(*) from table where loc between 300 to 400. 
  1. loc是一个 varchar 列。
  2. 它没有选择所有数据
  3. 检查计数,给出 ORA :01722 错误
  4. 导出错误的结果。

从评论编辑:

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

4

2 回答 2

0

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

您应该让它将 varchar 与 varchar 进行比较。

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

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

然后去阅读隐式转换

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

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

于 2018-07-03T05:43:42.847 回答
0

loc是一个 varchar 列。
[来自评论] Loc 列的 char 类型值也像 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 帐户)

于 2018-07-03T05:46:59.450 回答