如何在条件与数字之间使用 Oracle 中的字符串列

Posted

技术标签:

【中文标题】如何在条件与数字之间使用 Oracle 中的字符串列【英文标题】:How to use between condition with numbers for string columns in Oracle 【发布时间】:2019-01-22 08:00:19 【问题描述】:

我需要检查表中两个数字之间的条件,但 oracle DB 中的列具有字符串值。

我尝试了以下查询,没有任何帮助

select * from  sys.employee_infor where  to_number(emp_number) between 1200 and 2400;

select * from  sys.employee_infor where (emp_number) >= to_char(1200) and (emp_number)  <= to_char(2400);

select * from  sys.employee_infor where  to_number(emp_number) between '1200' and '2400';

收到的错误为:

ORA-01722: 无效号码

我的 Emp_number 列就像,

【问题讨论】:

您能提供一些示例数据吗?为什么要在emp_number 列中使用字符串类型存储数字值? 考虑不要将 SYS 模式用于您自己的数据。 SYS(和 SYSTEM)是特殊的,别管它们。如果您做了一些意外,您可能会破坏数据库。创建另一个用户并在那里做任何你正在做的事情。 从不永远SYSSYSTEM 架构中创建您自己的表。创建一个普通用户并在那里创建您的表。除了从事 DBA 工作之外,NOT 对您的应用程序使用 SYSSYSTEM。只是不要 我的专栏会是这样的 【参考方案1】:

safer solution 是使用CASE

SELECT *
FROM sys.employee_infor
WHERE CASE WHEN NOT REGEXP_LIKE(emp_number, '\D') THEN TO_NUMBER(emp_number) END BETWEEN 1200 AND 2400

【讨论】:

REGEXP_LIKE 运行查询需要很长时间,我需要将此子查询包含到主查询中,Sys 只是一个示例,用户名与 sys 不同。请帮我修复问题 正确的解决方案是将数字存储为数字。休息只是解决方法。您可以尝试使用更有效的正则表达式,例如CASE WHEN REGEXP_LIKE(emp_number, '^\d1,10$') THEN TO_NUMBER... 或添加另一个过滤器,例如WHERE emp_number BETWEEN '0' AND '9' AND CASE ...。或者在另一个答案中使用on conversion error 解决方案。【参考方案2】:

您的员工编号列中可能存在无法转换为数字的数据。

假设员工编号是一个整数值,以下查询将显示违规行:

select * from sys.employee_infor where regexp_like(emp_number, '[^0-9]');

您可以在查询中使用 where 子句来忽略格式错误的数据:

select * from (
    select * from sys.employee_infor where not regexp_like(emp_number, '[^0-9]')
) where  to_number(emp_number) between 1200 and 2400

PS : 因为您要比较的是数字,而不是字符串。

另一个解决方案是使用the DEFAULT ... ON CONVERSION ERROR option of function TO_NUMBER(),它从 Oracle 12c R2 开始可用。使用此选项会捕获转换错误并返回默认值而不是引发错误:

select * 
from sys.employee_infor 
where to_number(emp_number default 0 on conversion error) between 1200 and 2400

【讨论】:

【参考方案3】:

在许多情况下,这都会起作用:

where emp_number >= '1200' and emp_number <= '2400'

或:

where emp_number >= '1200' and emp_number <= '2400' and
      length(emp_number) = 4

这并不完全相同,因为它使用的是字符串比较而不是数字比较。另一方面,它可以利用索引。

【讨论】:

感谢您的建议,但是当我使用单个条件时,它会返回值,但使用两个条件时没有返回任何内容。还有如果'100'和'1000'之间的比较呢

以上是关于如何在条件与数字之间使用 Oracle 中的字符串列的主要内容,如果未能解决你的问题,请参考以下文章

如何从oracle中的字符串中获取固定长度的数字

如何根据 Oracle 表格 6i 中的某些条件在两个 LOV 之间进行选择

如何查出在oracle 表中的某个字段中符合以下要求:包括除汉字、数字、字母、中画线、括弧外的其它字符

Oracle多关键字查询

oracle中字符串的大小比较,字符串与数字的比较和运算

Oracle 在 IN 条件中使用字符串