sql >> データベース >  >> RDS >> Oracle

列内の値を選択する方法

    regexpsplit を使用したソリューションに基づく 次のクエリを実行できます。

    ただし、結果の列の最大数を事前に知っておく必要があることに注意してください。

     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  
    

    繰り返しになりますが、ご覧のとおり、クエリの結果の列をすべてリストする必要があります。




    1. タイプorg.postgresql.util.PGobjectの受信オブジェクト

    2. SQLでの順序付けされていない結果

    3. MariaDBでデータベース照合を取得する4つの方法

    4. Oracle集合演算子