根据子字符串的静态长度在ORACLE中将列拆分为多行

时间:2018-10-04 06:29:38

标签: sql oracle oracle11g oracle12c

我在这里看到了“将列拆分为多行”的多个主题,但是它们都是基于某些定界符的。

我想根据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
...

以此类推。

请帮助我。预先感谢。

4 个答案:

答案 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()