匹配2个具有不同字符长度的字段,substr?填充?

时间:2018-09-22 04:20:29

标签: sql oracle select padding substr

我需要能够编写一个SQL以匹配customerid,其中表之间的字符数不同。正如您将在下面看到的,表1具有没有填充的CustomerId(字符数可能会有所不同,如示例中所示)。表2的特定格式为'0001'+ 0填充,以使该字段总计30个字符。

因此,如果我需要为此编写SQL,那么对于table1 CustomerIds,这将是某种类型的子字符串吗?

示例:。 表1的客户ID为“ 123456”。 表2的客户ID为'000100000000000000000000123456'

示例2: 表1的客户ID为'98765432' 表2的客户ID为“ 000100000000000000000099765432”

4 个答案:

答案 0 :(得分:3)

您应该将table1中的值用0001和零填充,直到它是30个字符,然后使用该值进行比较。

where '0001'||lpad(columnname,'0',26) = columnname2

答案 1 :(得分:1)

........
where table2.customerID like '%' || table1.customerID

like确实是一个误称,表示“等于”。 '%'将匹配任意长度(零个或多个)的任意字符串。

答案 2 :(得分:0)

LIKE绝对应该是一个不错的选择。

另一种方法,假设列仅包含数字字符,则可以使用:-

ON ( TO_NUMBER(SUBSTR(tab2.customerid,5)) = tab1.customerid )

INDEX的基础上添加基于TO_NUMBER(SUBSTR(tab1.customerid,5)的功能可以加快查询速度。

答案 3 :(得分:0)

您也可以使用ltrim函数,例如下面的查询,只是从table2的customerid中修剪0或1:

   select * from ns_table2 a,ns_table3 b where 
   ltrim(b.val1,'01')=ltrim(a.val1,'01') ;

样本输入:

create table ns_table2(val1 varchar(30),val2 varchar(30));
create table ns_table3(val1 varchar(30),val2 varchar(30));

insert into ns_table2 values('123456','table2');
insert into ns_table2 values('98765432','table2');

insert into ns_table3 values('000100000000000000000000123456','table3');
insert into ns_table3 values('000100000000000000000098765432','table3');
select * from ns_table2 a,ns_table3 b where 
ltrim(b.val1,'01')=ltrim(a.val1,'01') ;    

示例输出:

123456      table2  000100000000000000000000123456  table3
98765432    table2  000100000000000000000098765432  table3