如何在条件与数字之间使用 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)是特殊的,别管它们。如果您做了一些意外,您可能会破坏数据库。创建另一个用户并在那里做任何你正在做的事情。
从不、永远在SYS
或SYSTEM
架构中创建您自己的表。创建一个普通用户并在那里创建您的表。除了从事 DBA 工作之外,NOT 对您的应用程序使用 SYS
或 SYSTEM
。只是不要
我的专栏会是这样的
【参考方案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 表格 6i 中的某些条件在两个 LOV 之间进行选择