我需要能够编写一个SQL以匹配customerid,其中表之间的字符数不同。正如您将在下面看到的,表1具有没有填充的CustomerId(字符数可能会有所不同,如示例中所示)。表2的特定格式为'0001'+ 0填充,以使该字段总计30个字符。
因此,如果我需要为此编写SQL,那么对于table1 CustomerIds,这将是某种类型的子字符串吗?
示例:。 表1的客户ID为“ 123456”。 表2的客户ID为'000100000000000000000000123456'
示例2: 表1的客户ID为'98765432' 表2的客户ID为“ 000100000000000000000099765432”
答案 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