2015-07-24 9 views
0

Извинения за то, что вы использовали небольшую информацию, чем необходимо. Должно было обеспечить все это. Вот так.Как выбрать значения в столбце

Мы отправляем информацию об исправлении исправлений из многих БД с помощью инструмента в некоторые журналы на другом сервере, у этого сервера есть основной БД, который будет хранить эту информацию для последующего сравнения. Мы используем теги «<>», чтобы сделать наши заявления уникальными для идентификации.

Файл журнала информация будет выглядеть следующим образом:

StepLog: Инфо: имя_бд instance_name имя хоста objnames и так далее ..

Из базы данных на этом сервере, как извлечь только значения между теги для хранения/вставки в таблицу и пропустить теги. Поскольку информация будет меня из нескольких БД, не может содержать информацию о цитатах.

Спасибо.

+0

Что вы задают теги? ORCL? Пожалуйста, предоставьте нам некоторые данные об образцах и ожидаемый вывод, чтобы лучше понять проблему ура. – Crazy2crack

+0

Нам нужно больше информации, прежде чем кто-нибудь сможет начать отвечать на этот вопрос. Пожалуйста, отправьте примеры данных, соответствующих таблиц и точно, каков ваш желаемый результат. Как бы то ни было, на ваш вопрос нельзя ответить. – Ollie

+0

хорошо, вы получаете разные решения для строк CSV и для XML. Ответ ниже относится к формату в исходном вопросе ''Orcl, orcl, linux box, Pass, tablespace_name1, tablespace_name2''. –

ответ

0

На основе решения с regexp split вы можете запустить следующий запрос.

Обратите внимание, что вы должны знать максимальное количество полученных столбцов заранее.

with t1 as (select 1 rn, 'Orcl, orcl, linux box, Pass, tablespace_name1, tablespace_name2' col from dual union all 
       select 2 rn, 'Orcl2, orcl2, linux box2, Pass2, tablespace_name12, tablespace_name22' col from dual), 
     t2 as (select rownum colnum from dual connect by level <= 6 /* (max) number of columns */) 
select t1.rn, t2.colnum, rtrim(ltrim(regexp_substr(t1.col,'[^,]+', 1, t2.colnum))) col from t1, t2 
where regexp_substr(t1.col, '[^,]+', 1, t2.colnum) is not null 
order by rn,colnum; 

Это дает ряд, столбец и ключ вид:

RN  COLNUM COL                 
----- ---------- ------------------ 
    1   1 Orcl                 
    1   2 orcl                 
    1   3 linux box                
    1   4 Pass                 
    1   5 tablespace_name1              
    1   6 tablespace_name2              
    2   1 Orcl2                 
    2   2 orcl2                 
    2   3 linux box2                
    2   4 Pass2                 
    2   5 tablespace_name12              
    2   6 tablespace_name22 

Вы можете использовать запрос PIVOT, чтобы получить результат в плоском столе

with t1 as (select 1 rn, 'Orcl, orcl, linux box, Pass, tablespace_name1, tablespace_name2' col from dual union all 
       select 2 rn, 'Orcl2, orcl2, linux box2, Pass2, tablespace_name12, tablespace_name22' col from dual), 
     t2 as (select rownum colnum from dual connect by level <= 6 /* (max) number of columns */), 
     t3 as (select t1.rn, t2.colnum, rtrim(ltrim(regexp_substr(t1.col,'[^,]+', 1, t2.colnum))) col from t1, t2 
     where regexp_substr(t1.col, '[^,]+', 1, t2.colnum) is not null) 
select * from t3 
PIVOT (max(col) col for (colnum) in 
(1 as "1", 
    2 as "2", 
    3 as "3", 
    4 as "4", 
    5 as "5", 
    6 as "6")) 
order by rn; 


    RN 1_COL  2_COL  3_COL  4_COL  5_COL    6_COL 
----- --------- --------- --------- --------- ---------   --------- 
    1 Orcl  orcl  linux box Pass  tablespace_name1 tablespace_name2 
    2 Orcl2  orcl2  linux box2Pass2  tablespace_name12 tablespace_name22 

Опять же, как вы видите вы должны указать все результирующие столбцы в запросе.

Смежные вопросы