在没有substr和union函数的情况下简化oracle查询

时间:2014-11-14 11:51:22

标签: sql oracle

我想根据字符长度将第1列值分成多个值。

示例: 在地址栏中,前10个字符应加载到第一行。根据empno,empname,第二行中应加载第二个10个字符。

来源表:

empid:1 empname:aaa       address: SONY/SB/743-0198/23-7.SCU P/N 743-0198-003. MOD DOT   

目标表:

empid:1 empname:aaa       address:SONY/SB/74
empid:1 empname:aaa       address:3-0198/23-
empid:1 empname:aaa       address:SCU P/N 74.

我尝试使用substr fun。

select empno,empname,substr(address,1,10) from emp
union
select empno,empname,substr(address,11,10) from emp;

而不是使用substr和union是他们实现这一目标的任何其他方式。

2 个答案:

答案 0 :(得分:1)

如果你从一个数字列表开始,你可以这样做:

with n as (
        select 1 as n from dual union all
        select 11 from dual union all
        select 21 from dual
       )
select e.empno, e.empname, substr(e.address, n.n, 10)
from emp e join
     n
     on length(address) <= n.n + 10;

您可以使用递归子查询n或在表格上使用connect by level来生成rownum的值,而不是单独列出它们。但是,对于三个值,输入它们很容易。

答案 1 :(得分:1)

这是一个仍然使用substr的尝试,但不是union:

with w as
(
  select 1 + 10 * (level - 1) n
  from dual
  connect by level <= 3
)
select t.empid, t.empname, substr(t.address, w.n, 10) address
from w
cross join test t
;