我正在尝试将两个表连接在一起,但是一个表中的键被格式化为'xxxxxx',而我试图在第二个表中连接在一起的键被格式化为'2222xxxxxx'。有没有办法可以将第二列拆分成两个不同的列来进行连接,或者只连接第2列的最后6个数字?
注意:值是数字。 '2222'总是相同的4个数字。
答案 0 :(得分:3)
尝试这种方式:
select *
from table1 a
INNER JOIN table2 b
on a.fieldname = substr(b.fieldname, -6)
以下是Oracle中SUBSTR Function的文档。
要知道这对于你的第二个表是一个非常糟糕的设计,你应该考虑将这些值分成不同的列。
修改强>
来自@Boneist的评论"如果在前4个之后有7个数字,而不仅仅是6个?"
要解决此问题,您应该使用:substr(b.fieldname, 5)
要在select语句中分隔该列,您可以创建一个新列并使用给定的substr
更新它的值,或者只是将它添加到select命令中。
在select
命令中:
select fielda, fieldb,
substr(b.fieldname, 1, 4) firstPartOfField,
substr(b.fieldname, 5) secondPartOfField
from tableb
要创建另一列,它将是
alter table tableb add column newField number(6);
update tableb
set oldField = substr(b.fieldname,1,4),
newField = substr(b.fieldname,5);
答案 1 :(得分:0)
我建议采用略有不同的方法:
如果您的列具有varchar / char数据类型:
drop table tab1;
drop table tab2;
create table tab1(col char(30));
create table tab2(col char(30));
insert into tab1
select lpad(to_char(level), 6, '0') as val
from dual connect by level <=100 order by level;
insert into tab2
select '2222' || lpad(to_char(level), 6, '0') as val
from dual connect by level <=100 order by level;
create unique index ux_tab1 on tab1(col);
create unique index ux_tab2 on tab2(col);
select tab1.col, tab2.col
from tab1
join tab2
on '2222' || tab1.col = tab2.col;
-- check execution plan
explain plan for
select tab1.col, tab2.col
from tab1
join tab2
on '2222' || tab1.col = tab2.col;
select * from table(dbms_xplan.display);
如果您的列具有数字数据类型:
drop table tab1;
drop table tab2;
create table tab1(col number);
create table tab2(col number);
insert into tab1
select 100000 + level as val
from dual connect by level <=100 order by level;
insert into tab2
select 2222100000 + level as val
from dual connect by level <=100 order by level;
create unique index ux_tab1 on tab1(col);
create unique index ux_tab2 on tab2(col);
select tab1.col, tab2.col
from tab1
join tab2
on 2222000000 + tab1.col = tab2.col;
-- check execution plan
explain plan for
select tab1.col, tab2.col
from tab1
join tab2
on 2222000000 + tab1.col = tab2.col;
select * from table(dbms_xplan.display);
使用这种方法,Oracle将能够使用索引加入!