2015-04-16 4 views
1

У меня есть таблица со столбцами в формате ниже (строка # только для указания номера строки).Разделите строку oracle в один столбец и вставьте в таблицу

Row#1 :test.doc#delimiter#1234,test1.doc#delimiter#1235,test2.doc#delimiter#1236<br> 
Row#2 :fil1.txt#delimiter#1456,fil1.txt#delimiter#1457 

Я хочу, чтобы разбить строку с помощью запятой (,) в качестве разделителя, список всех в одном столбце и вставить в новую таблицу.

выход должен быть что-то вроде этого (Row # просто указать номер строки):

Row#1:test.doc#delimiter#1234<br> 
Row#2:test1.doc#delimiter#1235<br> 
Row#3:test2.doc#delimiter#1236<br> 
Row#4: fil1.txt#delimiter#1456 

Может кто-нибудь помочь мне это сделать?

+0

вы хотите найти каждый существующий разделитель и раскол в этих местах? –

+0

Возможный дубликат [Oracle 10g Разделение строки на несколько строк] (http://stackoverflow.com/questions/14328621/oracle-10g-splitting-string-into-multiple -rows) – MT0

ответ

2
WITH data AS (
    SELECT 'test.doc#delimiter#1234,test1.doc#delimiter#1235,test2.doc#delimiter#1236' AS "value" FROM DUAL 
    UNION ALL 
    SELECT 'fil1.txt#delimiter#1456,fil1.txt#delimiter#1457' AS "value" FROM DUAL 
) 
SELECT REGEXP_SUBSTR(data."value", '[^,]+', 1, levels.COLUMN_VALUE) 
FROM data, 
     TABLE(
      CAST(
      MULTISET(
       SELECT LEVEL 
       FROM DUAL 
       CONNECT BY LEVEL <= LENGTH(regexp_replace("value", '[^,]+')) + 1 
      ) AS sys.OdciNumberList 
     ) 
     ) levels; 
+0

@Aramillo OP указывает: '(Row # просто указать номер строки) ' – MT0

0

, если вы хотите, чтобы найти существующий delimier и разделить его

попробовать этот запрос:

select substr(filed_name , 
       REGEXP_SUBSTR(filed_name,'#demilimer#',1), 
       (REGEXP_SUBSTR(filed_name,'#demilimer#',2)-1) 
    ) col1 , 

    substr(filed_name , 
       REGEXP_SUBSTR(filed_name,'#demilimer#',2), 
       REGEXP_SUBSTR(filed_name,'#demilimer#',3)- (REGEXP_SUBSTR(filed_name,'#demilimer#',2)) 
    ) col2 , 
    substr(filed_name , 
       REGEXP_SUBSTR(filed_name,'#demilimer#',3), 
       length(filed_name)- (REGEXP_SUBSTR(filed_name,'#demilimer#',3)) 
    ) col3  /* last col should take up to the length */ 

from table_name 
1

Простой способ будет для каждой строки, разделить строку на несколько строк и вставить его в таблицу назначения. Существует несколько способов разделить одну строку на несколько строк на этом сайте. Простой поиск даст вам несколько ответов.

Предполагая, что таблица называется origtable, столбец с этими строками называется mycol, а таблица назначения называется destTable.

BEGIN 
    FOR orig_row IN (SELECT mycol from origTable) LOOP 
     INSERT INTO destTable(outCol) 
     SELECT REGEXP_SUBSTR (orig_row.mycol,'(.*?)(,|$)',1,LEVEL,NULL,1) 
      FROM dual 
     CONNECT BY LEVEL <= REGEXP_COUNT (orig_row.mycol, ',') + 1; 
    END LOOP; 
END; 
Смежные вопросы