【问题标题】:How to select values within a column如何在列中选择值
【发布时间】:2015-10-14 14:42:11
【问题描述】:

很抱歉分享的信息太少了。应该提供整个事情。就是这样。

我们正在通过一个工具将预检查补丁信息从许多数据库发送到另一台服务器上的一些日志,该服务器具有主数据库,它将存储此信息以供以后比较。我们正在使用标签“”来使我们的陈述具有唯一性以进行识别。

日志文件信息如下所示:

StepLog:Info: dbname instance_name 主机名 objnames 等等..

如何从该服务器上的数据库中仅提取标签之间的值以存储/插入表中,并跳过标签。由于信息将来自多个数据库,因此我无法硬引用信息。

谢谢。

【问题讨论】:

  • 这里的标签是什么意思?兽人?请向我们提供一些示例数据和预期输出,以更好地了解您的问题
  • 在任何人开始回答这个问题之前,还需要更多信息。请发布数据示例、所涉及的表格以及您想要的结果。就目前而言,您的问题无法回答。
  • 那么您将获得针对 CSV 字符串和 XML 的不同解决方案。下面的答案与原问题'Orcl, orcl, linux box, Pass, tablespace_name1, tablespace_name2'中的格式有关。

标签: oracle oracle11g oracle10g oracle-sqldeveloper


【解决方案1】:

根据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  

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

【讨论】:

    猜你喜欢
    • 2023-02-11
    • 1970-01-01
    • 2021-06-14
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多