2017-01-30 2 views
0

Ich habe eine Zeichenfolge wie ',, defoifcd, 87765' in einer Oracle-Tabelle. Means, die ersten beiden Strings sind leer.so muss ich die Zeichenfolge durch Komma als Trennzeichen in Oracle.i aufteilen Ich schreibe diese AbfrageSplit String durch Trennzeichen Position mit Oracle

SELECT 
REGEXP_SUBSTR (TEST_STRING, '[^,]+', 1, 1) AS part_1, 
REGEXP_SUBSTR (TEST_STRING, '[^,]+', 1, 2) AS part_2, 
REGEXP_SUBSTR (TEST_STRING, '[^,]+', 1, 3) AS part_3, 
REGEXP_SUBSTR (TEST_STRING, '[^,]+', 1, 4) AS part_4 
FROM ABCD 
; 

hier ABCD ist meine Tabelle und TEST_STRING ist mein coulmn.

aber Ergebnis Rückkehr wie

PART_1, part_2, part_3, part_4 
defoifcd,87765 

Aber ich möchte das Ergebnis wie,

PART_1, part_2, part_3, part_4 
        defoifcd, 87765 

bedeutet i die 'defoifcd' müssen und '87765' Wert in part_3 und part_4 Spalte, weil ersten beiden Saiten sind leer, aber von meiner Abfrage ist comimg in part_1 und part_2 Spalte.

+0

Mögliche Duplikat [Split Komma Werte Spalten in Oracle getrennt] (http://stackoverflow.com/questions/31464275/split-comma-separated-values-to-columns-in-oracle) –

+0

To sei ganz konkret: überprüfe nicht die angenommene Antwort, sondern die von Gary: er erklärt und repariert dein aktuelles Problem. –

+0

Sind es immer genau vier Teile? – mathguy

Antwort

1

Wenn Sie nur eine Zeichenkette haben und Sie wissen, dass sie immer genau vier Teile hat, können Sie sie so aufteilen, indem Sie nur Standard-Zeichenketten verwenden (und reguläre Ausdrücke vermeiden, die flexibler, aber oft langsamer sind).

HINWEIS: Die zweite Hälfte dieser Antwort bezieht sich auf Strings mit variabler Anzahl von "Teilen".

with inputs (str) as (
     select ',,defoifcd,87765' from dual 
    ) 
-- end of TEST data; SQL query begins below (use your actual table and column names) 
select substr(str, 1, instr(str, ',') - 1) as part_1, 
     substr(str, instr(str, ',') + 1, 
       instr(str, ',', 1, 2) - instr(str, ',') - 1) as part_2, 
     substr(str, instr(str, ',', 1, 2) + 1, 
       instr(str, ',', 1, 3) - instr(str, ',', 1, 2) - 1) as part_3, 
     substr(str, instr(str, ',', -1) + 1) as part_4 
from inputs; 

PART_1 PART_2 PART_3 PART_4 
-------- -------- -------- -------- 
        defoifcd 87765 

1 row selected. 

Wenn die Anzahl der Teile nicht im Voraus bekannt ist, ist es besser, die Ausgabe in einem anderen Format zu erhalten (den Ausgang unten). Wenn man die Teile in Spalten anordnen muss, die nach jeder anderen Verarbeitung gemacht werden können - und das ist immer am besten der Reporting-Anwendung überlassen und nicht in SQL.

with inputs (id, str) as (
     select 1, ',,defoifcd,87765' from dual union all 
     select 2, ''     from dual union all 
     select 3, 'a, b, c'   from dual 
    ) 
-- end of TEST data; SQL query begins below (use your actual table and column names) 
select id, str, level as part_number, 
     substr(aug_str, instr(aug_str, ',', 1, level) + 1, 
       instr(aug_str, ',', 1, level + 1) - instr(aug_str, ',', 1, level) - 1) as val 
from (select id, str, ',' || str || ',' as aug_str from inputs) 
connect by level <= length(str) - length(translate(str, 'z,', 'z')) + 1 
     and prior id = id 
     and prior sys_guid() is not null 
; 

ID STR    PART_NUMBER VAL 
-- ---------------- ----------- ---------- 
1 ,,defoifcd,87765   1 
1 ,,defoifcd,87765   2 
1 ,,defoifcd,87765   3 defoifcd 
1 ,,defoifcd,87765   4 87765 
2       1 
3 a, b, c     1 a 
3 a, b, c     2 b 
3 a, b, c     3 c 

8 rows selected. 
+0

Ihr erstes Beispiel war genau das, was ich durchmachte ; Dein zweites Beispiel ist sehr kreativ;) – BobC

Verwandte Themen