PL Sql解析#Carracter

时间:2013-03-09 13:46:54

标签: sql plsql

我在表中有一条只包含一列的记录,其列包含像字符串一样的数据。

  

d#1001111068#112B#0010040130022013012111505444 ## 20130121110800#20130121115054#01# - ## 240#的用户名的用户名##20130124171831#20130130#6

在#chracters之间,每个字符串在其他表中显示一个列。

D# 
1001111068#                          --Customer Number 
112B#                                --Procut Id 
0010040130022013012111505444#        --Serial Number 
#                                    --Order Number(empty record)     
20130121110800#                      --X Columns

我想解析这些项​​并插入到其他表中。 怎么写这个。

2 个答案:

答案 0 :(得分:1)

您可以通过以下表达式提取第n个子字符串:

regexp_substr(source_string, '([^#]*)(#|$)', 1, n, '', 1)

完整查询:

create table your_table(
   source_string varchar2(4000)
);

insert into your_table
values('D#1001111068#112B#0010040130022013012111505444##20130121110800#20130121115054#01#-##240#username#username#20130124171831#20130130#6');

select 
  n,
  regexp_substr(source_string, '([^#]*)(#|$)', 1, n, '', 1) 
from your_table,
(
  select level as n from dual 
  connect by level <= (
    select max(regexp_count(source_string, '#')) + 1 
    from your_table
  )
) 
where n <= regexp_count(source_string, '#') + 1;

输出:

1   D
2   1001111068
3   112B
4   0010040130022013012111505444
5   (null)
6   20130121110800
7   20130121115054
8   01
9   -
10  (null)
11  240
12  username
13  username
14  20130124171831
15  20130130
16  6

fiddle

答案 1 :(得分:0)

您正在寻找的功能是regexp_substr