我想根据字符长度将第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是他们实现这一目标的任何其他方式。
答案 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
;