Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle11g 带左零填充的Oracle SQL匹配字符串_Oracle11g_Padding_Trim - Fatal编程技术网

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

Oracle11g 带左零填充的Oracle SQL匹配字符串,oracle11g,padding,trim,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字节)列 你能帮我吗 编辑: 准确地说,如果我执行查询: select disti

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

我试过这个:

select distinct val
from table_one
where val = '00563' OR 
      val = ltrim('00563', '0');
但是不起作用。 val是一个CHAR(5字节)列

你能帮我吗

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

select distinct val
from table_one;
结果是:

5034 
(null)
4dsfd
01005
03030
03075
05034

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

您需要使正在搜索的列值和文本值匹配—显式地使它们具有相同的数据类型(和长度)

这个答案的早期版本给出了基于未知和假设的各种排列,但总结了注释:您的
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  

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

查看您提供的值。我猜在填充之前,您的值最多有3个数字。请记住,您可以尝试此操作-

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

在第一个代码段中,
ltrim('00563','0')
只是一个文本
'563'
,不知道为什么需要
ltrim()
。您可能是说'563'可能是某种类型的变量(例如绑定变量)-在这种情况下,它不是一个文本。然后,即使这个变量是一个数字,在第二个代码段中,最好将它显式地转换为字符串,可能使用
转换为_char()
。最后,如果仍然需要将
val
封装在RHS上的函数调用中,那么在LHS上单独使用
val是没有意义的;因为这一点,您仍然无法使用索引。OP显示的是零填充文字,所以我从最坏的情况开始。是的,我有点假设它们可能真的有一个变量,可能是一个零填充字符串,但如果它们有或可以有一个数字,我已经展示了等效的字符串。但是,为问题显示不同的字符串文字似乎没有什么用处。(第二个字符串会隐式地将修剪后的LHS转换为数字进行比较;我添加了另一个将RHS转换为字符串的字符串。)如果值太短,Valo的值必须是零值为5的char数。然而,我必须从一个服务中获取这个值,该值将Valas作为数字,并且移除初始0。不幸的是,这是不正确的,但是旧数据现在被存储在DB上,并且我需要找到甚至没有0的值。带有类似“无效数字”的错误。问题是否可能是数据库中存储的值不正确,如null或“4dsfd”?@DeooK-只有2ns、4th和5th变量才能给出该错误,除非您没有显示其他条件。通过将
val
隐式或显式转换为一个数字,您将得到该错误的值正如我在回答中提到的,不需要转换。其他的应该可以工作。不完全是:如果值是“1”,我必须找到“1”、“01”、“001”、“0001”和“00001”。最大长度是5。好的,如果最大长度是5,那么上面的查询将工作。通过该查询,我找到了所有以0开头的值。