如何在Oracle SQL

时间:2016-02-10 16:51:56

标签: oracle

我正在尝试将两个表连接在一起,但是一个表中的键被格式化为'xxxxxx',而我试图在第二个表中连接在一起的键被格式化为'2222xxxxxx'。有没有办法可以将第二列拆分成两个不同的列来进行连接,或者只连接第2列的最后6个数字?

注意:值是数字。 '2222'总是相同的4个数字。

2 个答案:

答案 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将能够使用索引加入!