如何选择列中的值

时间:2015-07-24 03:44:42

标签: oracle oracle11g oracle10g oracle-sqldeveloper

道歉,分享的信息比需要的少。应该提供整件事。在这里。

我们通过工具将许多数据库中的预检修补信息发送到另一台服务器上的某些日志,该服务器具有主数据库,该数据库将存储此信息以便稍后进行比较。我们正在使用标签"<>"使我们的陈述与识别无关。

日志文件信息如下所示:

StepLog:Info:dbname instance_name hostname objnames 等等..

从该服务器上的数据库中,如何仅提取要在表中存储/插入的标记之间的值,并跳过标记。由于来自多个数据库的信息,我不能用硬引用信息。

感谢。

1 个答案:

答案 0 :(得分: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  

同样,如您所见,您必须在查询中列出所有结果列。