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

Oracle データベースからのデータの取得と表示

    次のような方法で、列の説明/名前を決定論的な順序で取得できます:

    select coalesce(ct.col_desc, ct.col_name)from col_tab ctleft join user_tab_columns utcon utc.table_name =ct.table_name and utc.column_name =ct.col_namewhere ct.table_name ='TABLE1'order by utc.column_id , ct.col_name;  
    COALESCE(CT.COL_----------------TABLE 1 COLUMN 3TABLE 1 COLUMN 1TAB1_COL_5TABLE 1 COLUMN 2TABLE 1 COLUMN 4  

    これらの行を列にピボットするには、動的に行う必要があります。

    動的クエリを生成して、同様の方法で同じ順序でデータを取得することもできます。

    これは、SQL*Plus (または SQLcl、または SQL Developer) バインド変数 ref カーソルを使用して 2 つの出力を取得し、ブロック内で定義されたテーブル名を使用します。しかし、テーブル名が渡され、ref カーソルのパラメータを持っているプロシージャに簡単に適応させることができます:

    var rc1 refcursor;var rc2 refcursor;declare l_table_name varchar2(30) :='TABLE1'; l_stmt varchar2(4000);begin select 'select ' || listagg('''' || coalesce(ct.col_desc, ct.col_name) || '''', ',') グループ内 (utc.column_id、ct.col_name 順) || ' from dual' into l_stmt from col_tab ct left join user_tab_columns utc on utc.table_name =ct.table_name and utc.column_name =ct.col_name where ct.table_name =l_table_name; dbms_output.put_line(l_stmt); l_stmt の :rc1 を開きます。 || 「選択」を選択 || listagg(coalesce(utc.column_name, 'null') || ' as ' || ct.col_name, ',') グループ内 (utc.column_id, ct.col_name 順) || ' から ' || col_tab ct から l_stmt への l_table_name utc.table_name =ct.table_name および utc.column_name =ct.col_name で user_tab_columns utc を左結合します。ここで、ct.table_name =l_table_name; dbms_output.put_line(l_stmt); open :rc2 for l_stmt;end;/  

    ブロックを実行すると dbms_output が取得されます デバッグのためだけのステートメントですが、興味があるかもしれません:

    select 'TABLE 1 COLUMN 3','TABLE 1 COLUMN 1','TAB1_COL_5','TABLE 1 COLUMN 2','TABLE 1 COLUMN 4' from dualselect TAB1_COL_3 as TAB1_COL_3,TAB1_COL_1 as TAB1_COL_1,TAB1_COL_5 as TAB1_COL_5、TAB1_COL_2 as TAB1_COL_2、null as TAB1_COL_4 from TABLE1  

    次に、参照カーソルを出力できます (これもクライアント固有の動作です):

    print rc1'TABLE1COLUMN3' 'TABLE1COLUMN1' 'TAB1_COL_ 'TABLE1COLUMN2' 'TABLE1COLUMN4' ---------------- ------------ ---- ---------- ---------------- ---------------- 表 1 列 3表 1 列 1 TAB1_COL_5 表 1 列 2 表 1 列 4print rc2TAB1_COL_3 TAB1_COL_1 TAB1_COL_5 TAB1_COL_2 TAB1_COL_4 --------------- ------------- ---- ---------- ------------- ----------TAB1_COL3_DATA1 TAB1_COL1_DAT TAB1_COL5_DAT2 TAB1_COL2_DAT TAB1_COL3_DATA2 TAB1_COL1_DAT TAB1_COL5_DAT1 TAB1_COL2_DAT TAB1_COL3_DATA3 TAB1_COL1_DAT TAB1_COL5_DAT3 TAB1_コード 

    その場合、ケース式を使用して順序ロジックを拡張できます:

     グループ内 (「TAB1_COL_3」の場合は ct.col_name、「TAB1_COL_1」の場合は 1、「TAB1_COL_1」の場合は 2、それ以外は 3 end、utc.column_id、ct.col_name) の場合  

    'TABLE1COLUMN3' 'TABLE1COLUMN1' 'TAB1_COL_ 'TABLE1COLUMN2' 'TABLE1COLUMN4' ---------------- -------------- -- ---------- ---------------- ---------------- 表 1 列 3 表 1列 1 TAB1_COL_5 表 1 列 2 表 1 列 4TAB1_COL_3 TAB1_COL_1 TAB1_COL_5 TAB1_COL_2 TAB1_COL_4 --------------- ------------- ------- ------- ------------- ----------TAB1_COL3_DATA1 TAB1_COL1_DAT TAB1_COL5_DAT2 TAB1_COL2_DAT TAB1_COL3_DATA2 TAB1_COL1_DAT TAB1_COL5_DAT1 TAB1_COL2_DAT TAB1_COL3_DATA3 TAB1_COL1_DAT TAB1_COL5_DAT3 TAB1_コード 

    または、同じままであるのが名前か説明かによって、名前の代わりに説明を使用する可能性があります (例から推測するのは困難です)。

    結局のところ、ここでは実際には必要なく、listagg よりも複雑です。 上記で使用しました。しかし、次のようなこともできます;

     select 'select * from ( select row_number() over (order by case ct.col_name when ''TAB1_COL_3'' then 1 when ''TAB1_COL_1'' then 2 else 3 end, utc.column_id, ct. col_name) as pos、coalesce(ct.col_desc, ct.col_name) as name as col_tab ct left join user_tab_columns utc on utc.table_name =ct.table_name and utc.column_name =ct.col_name where ct.table_name =:tab)pivot ( max(name) as col for (pos) in ('|| listagg(level, ',') within group (order by level)|| '))' into l_stmt from dual connect by level <=(select count(* ) col_tab から table_name =l_table_name); dbms_output.put_line(l_stmt); l_table_name; を使用して l_stmt の :rc1 を開きます。  

    生成された動的クエリを次のように示す出力を取得します:

    select * from ( select row_number() over ('TAB1_COL_3' の場合は ct.col_name の場合、'TAB1_COL_1' の場合は 1 の場合は 1、次に 2 の場合は 3 end、utc.column_id, ct.col_name) を pos として、結合します。 (ct.col_desc, ct.col_name) as name from col_tab ct left join user_tab_columns utc on utc.table_name =ct.table_name and utc.column_name =ct.col_name where ct.table_name =:tab)pivot (max(name) as col for (pos) in (1,2,3,4,5))  

    結果セット:

    1_COL 2_COL 3_COL 4_COL 5_COL ---------------- ---------------- ---------- --------- ---------------- ---------------- 表 1 列 3 表 1 列 1 TAB1_COL_5表 1 列 2 表 1 列 4  

    pos の代わりにピボットの列名を使用できます 、それらの周りに引用符を含める必要があるため、読みにくくなるだけだと思います.




    1. MysqlはAmazonEC2のソケットを介してローカルサーバーに接続できません

    2. アクティビティデータに基づいてID列を作成します

    3. 2つの可能なテーブルのいずれかにMySQL外部キーを実行することは可能ですか?

    4. ラグの長さが可変の難しさ