2016-05-24 7 views
0

Ich schreibe eine Abfrage in Oracle zu wählen, wo ich Anforderung habe Alphabet + Zahlen und Zahlen nach Sonderzeichen wie zwei verschiedene SpaltenOracle Abfrage separate Alphabet + Zahlen und Zahlen nach Sonderzeichen

Eg zu trennen.

Colum Wert ist
ABC 123 # 78800, XYZ # 4666, PQR 444 # 9900

Ausgabe Erforderlich
Spalte 1: ABC 123, XYZ, PQR 444
Spalte 2: 78.800, 4666, 9900

I versucht folgende Abfrage:
UEBER wählen ('ABC 123 # 78800, XYZ # 4666, PQR 444 # 9900', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ# ',' ABCDEFGHIJKLMNOPQRSTUVWXYZ ') ​​von Dual.

Output ist "ABC, XYZ, PQR" Zahlen fehlen

+0

Dies ist schlechtes Design, Sie über das Ändern sie trotzig denken sollen. – sagi

+1

Bitte lesen Sie http://stackoverflow.com/help/how-to-ask. Stellen Sie eine Frage, zeigen Sie uns, was Sie bereits versucht haben und was nicht funktioniert. –

Antwort

1

Was Sie brauchen, sind 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; 

Editted: Ein redundantes Zeichen entfernen, wie durch MTO vorgeschlagen

+0

Funktioniert gut .. !! :) –

+0

Der reguläre Ausdruck '[^ #,^\,]' sucht nach einem einzelnen Zeichen, das weder '# ',', ','^',' \ 'oder', '(wieder) enthält. Ich glaube nicht, dass es tut, was Sie erwarten. – MT0

+0

@ MT0 Vielen Dank für den Vorschlag. Editiert. –

0

Oracle-Setup:

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; 
/

Abfrage:

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 
     ) 
     ); 

Ausgabe:

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