Oracle Query在特殊字符后选择单独的字母+数字和数字

时间:2016-05-24 09:55:27

标签: sql oracle

我在oracle中编写一个查询,我要求将特殊字符后的字母+数字和数字分隔为2个不同的列

例如

Colum Value
ABC 123#78800,XYZ#4666,PQR 444#9900

需要输出
第1栏:ABC 123,XYZ,PQR 444
第2栏:78800,4666,9900
尝试以下查询:
从双重选择TRANSLATE('ABC 123#78800,XYZ#4666,PQR 444#9900','ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789#','ABCDEFGHIJKLMNOPQRSTUVWXYZ')。

输出是“ABC,XYZ,PQR”号码丢失

2 个答案:

答案 0 :(得分:1)

您需要的是regex

with table_name as
(
    select 'ABC 123#78800,XYZ#4666,PQR 444#9900' col_name from dual
)
select 
    REGEXP_REPLACE(col_name,'#([^#,])*', null) alphabet_num
    ,REGEXP_REPLACE(col_name,'([^#,])*#', null) num_value
from 
    table_name;

编辑:根据MTO

的建议删除一些冗余字符

答案 1 :(得分:0)

Oracle安装程序

CREATE TABLE table_name ( col VARCHAR2(100) );

INSERT INTO table_name VALUES ( 'ABC 123#78800,XYZ#4666,PQR 444#9900' );

CREATE TYPE key_value_pair AS OBJECT(
  key   VARCHAR2(20),
  value NUMBER(10)
);
/

CREATE TYPE key_value_pair_table AS TABLE of key_value_pair;
/

<强>查询

SELECT *
FROM   table_name t,
       TABLE(
         CAST(
           MULTISET(
             SELECT REGEXP_SUBSTR( t.col, '(^|,)([^,#]+)#(\d+)', 1, LEVEL, NULL, 2 ),
                    TO_NUMBER(
                      REGEXP_SUBSTR( t.col, '(^|,)([^,#]+)#(\d+)', 1, LEVEL, NULL, 3 )
                    )
             FROM   DUAL
             CONNECT BY LEVEL <= REGEXP_COUNT( t.col, '(^|,)([^,#]+)#(\d+)' )
           )
           AS key_value_pair_table
         )
       );

<强>输出

COL                                 KEY     VALUE
----------------------------------- ------- -----
ABC 123#78800,XYZ#4666,PQR 444#9900 ABC 123 78800
ABC 123#78800,XYZ#4666,PQR 444#9900 XYZ      4666
ABC 123#78800,XYZ#4666,PQR 444#9900 PQR 444  9900
相关问题