Oracle SQL匹配带左零填充的字符串

时间:2017-06-07 16:05:02

标签: oracle11g padding trim

我必须找到能够或不能以零开头的字符串。 例如,如果我在我的数据库中有值'00563','563','43563','0563',我必须找到行'00563','563','0563'。

我试过这个:

select distinct val
from table_one
where val = '00563' OR 
      val = ltrim('00563', '0');

但不起作用。 val是CHAR(5 BYTE)列。

你能帮助我吗?

编辑: 确切地说,如果我执行查询:

select distinct val
from table_one;

结果是:

5034 
(null)
4dsfd
01005
03030
03075
05034

对我来说,05034和5034是相同的值。

2 个答案:

答案 0 :(得分:0)

您需要使列值和您要搜索的文字值匹配 - 明确地使它们具有相同的数据类型(和长度)。

此答案的早期版本根据未知和假设给出了各种排列,但总结了评论:您的val列定义为char(5)(因此值为空格填充,必须考虑到),可能有无法转换为数字的值,并且您要比较的值(文字或变量)是一个数字。基于所有这些变化与您无关,您可以这样做:

select distinct val
from table_one
where lpad(trim(val), 5, '0') = lpad(to_char(563), 5, '0');

修剪表格列中的val以删除空格(因为它是char),然后用零填充最大长度。您要比较的数字将转换为字符串,并且零填充为相同的长度。然后可以比较这两个字符串。

使用一些示例数据:

create table table_one(val char(5));
insert into table_one
  select '00563' from dual
  union all select '563' from dual
  union all select '43563' from dual
  union all select '0563' from dual
  union all select '09999' from dual
  union all select '4dsfd' from dual;

select distinct val
from table_one
where lpad(trim(val), 5, '0') = lpad(to_char(563), 5, '0');

VAL  
-----
00563
0563 
563  

将一个函数应用于表列值将阻止使用该列上的任何索引,但这似乎是不可避免的,除非您可以清理表中的数据。

答案 1 :(得分:0)

查看您提供的值。我猜你的值在填充之前最多有3个数字。牢记这一点,你可以试试这个 -

select distinct val from table_one where regexp_like(val,'^0*[0-9]{1,4}$');