我在这里看到了“将列拆分为多行”的多个主题,但是它们都是基于某些定界符的。
我想根据Oracle中的长度拆分列。
假设我有一张桌子
codes | product --------------------------+-------- C111C222C333C444C555..... | A
代码是VARCHAR2(800)类型,乘积是VARCHAR2(1)。
在代码字段中,我们有很多代码(最多200个)属于产品A。每个代码的长度为4(因此C111,C222,C333是不同的代码)
我想要这样的选择查询输出-
code | product ---------------+------- C111 | A C222 | A C333 | A C444 | A C555 | A ...
以此类推。
请帮助我。预先感谢。
答案 0 :(得分:0)
这就是我要怎么做。让我知道您是否需要更多输入/更好的解释:
select substr(tt.codes,(((t.l-1)*4)+1),4) code,tt.product from tst_tab tt
join (select level l from dual connect by level <= (select max(length(codes)/4) from tst_tab)) t
on t.l <= length(tt.codes)/4
order by tt.product,t.l;
一些说明:
-- this part gives the numbers from 1 ... maximum number of codes in codes column
select level l from dual connect by level <= (select max(length(codes)/4) from tst_tab);
-- here is the query without the code extraction, it is just the numbers 1... numbers of codes for the product
select t.l,tt.product from tst_tab tt
join (select level l from dual connect by level <= (select max(length(codes)/4) from tst_tab)) t
on t.l <= length(tt.codes)/4
order by tt.product,t.l;
-- and then the substr just extracts the right code:
substr(tt.codes,(((t.l-1)*4)+1),4)
设置我的测试数据:
create table tst_tab (codes VARCHAR2(800),product VARCHAR2(1));
insert into tst_tab values ('C111C222C333C444C555','A');
insert into tst_tab values ('C111C222C333C444C555D666','B');
insert into tst_tab values ('C111','C');
commit;
答案 1 :(得分:0)
一个选项可能是这样:
SQL> with test (codes, product) as
2 (select 'C111C222C333C444C555', 'A' from dual union all
3 select 'D555D666D777', 'B' from dual
4 )
5 select substr(codes, 4 * (column_value - 1) + 1, 4) code, product
6 from test,
7 table(cast(multiset(select level from dual
8 connect by level <= length(codes) / 4
9 ) as sys.odcinumberlist))
10 order by 1;
CODE P
---- -
C111 A
C222 A
C333 A
C444 A
C555 A
D555 B
D666 B
D777 B
8 rows selected.
SQL>
答案 2 :(得分:0)
使用递归SQL来执行此操作还有一点不同。 (为了更简洁,我没有添加测试数据的示例。可以从@Littlefoot或@Peter答案中获取)
shutil.py
P.S。 @Thorsten Kettner就考虑重组表提出了一个正确的观点。这是正确的做法,以便将来更轻松地维护数据库
答案 3 :(得分:0)
这是使用regexp_substr()和CONNECT BY来通过4个字符的子字符串“循环”字符串的另一种形式:
FirebaseApp.configure()