Oracle SQL 匹配带有左零填充的字符串
Oracle SQL match string with left zeros padding
我必须找到可以或不能以零开头的字符串。
例如,如果我的数据库中有值“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 是相同的值。
您需要使要搜索的列值和文字值匹配 - 明确使它们具有相同的数据类型(和长度)。
此答案的早期版本基于未知数和假设给出了各种排列,但总结评论:您的 val
列定义为 char(5)
(因此值为 space-填充,必须考虑在内),可能具有无法转换为数字的值,并且您要比较的值(文字或变量)是一个数字。基于所有这些,大多数变体与您无关,您可以:
select distinct val
from table_one
where lpad(trim(val), 5, '0') = lpad(to_char(563), 5, '0');
table 列中的 val
被修剪以删除白色 space(因为它是 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
将函数应用于 table 列值将阻止使用该列上的任何索引,但这似乎无法避免,除非您可以清理 table 中的数据.
查看您提供的值。我猜你的值在被填充之前最多会有 3 个数字。记住这一点,你可以试试这个 -
select distinct val from table_one where regexp_like(val,'^0*[0-9]{1,4}$');
我必须找到可以或不能以零开头的字符串。 例如,如果我的数据库中有值“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 是相同的值。
您需要使要搜索的列值和文字值匹配 - 明确使它们具有相同的数据类型(和长度)。
此答案的早期版本基于未知数和假设给出了各种排列,但总结评论:您的 val
列定义为 char(5)
(因此值为 space-填充,必须考虑在内),可能具有无法转换为数字的值,并且您要比较的值(文字或变量)是一个数字。基于所有这些,大多数变体与您无关,您可以:
select distinct val
from table_one
where lpad(trim(val), 5, '0') = lpad(to_char(563), 5, '0');
table 列中的 val
被修剪以删除白色 space(因为它是 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
将函数应用于 table 列值将阻止使用该列上的任何索引,但这似乎无法避免,除非您可以清理 table 中的数据.
查看您提供的值。我猜你的值在被填充之前最多会有 3 个数字。记住这一点,你可以试试这个 -
select distinct val from table_one where regexp_like(val,'^0*[0-9]{1,4}$');