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

OracleSQL-動的なcaseステートメント

    動的列定義を備えたPIVOT関数が必要です。最も簡単な方法はピボットxmlです:

    create table tst_data (id int primary key, source varchar2(255));
    
    insert into tst_data values (1, 'INTERNET');
    insert into tst_data values (2, 'DEMO');
    insert into tst_data values (3, 'INTERNET');
    insert into tst_data values (4, 'SALES');
    insert into tst_data values (5, 'INTERNET');
    insert into tst_data values (6, 'DEMO');
    insert into tst_data values (7, 'INTERNET');
    insert into tst_data values (8, 'COM');
    
    commit;
    
    select * from (
      select source from tst_data
    ) 
    pivot xml 
    (
      count(1)
      for source in (select distinct t.source from tst_data t)
    )  
    

    XMLデータを処理する必要が生じた後:

    <PivotSet>
        <item>
            <column name = "SOURCE">COM</column>
            <column name = "COUNT(1)">1</column>
        </item>
        <item>
            <column name = "SOURCE">DEMO</column>
            <column name = "COUNT(1)">2</column>
        </item>
        <item>
            <column name = "SOURCE">INTERNET</column>
            <column name = "COUNT(1)">4</column>
        </item>
        <item>
            <column name = "SOURCE">SALES</column>
            <column name = "COUNT(1)">1</column>
        </item>
    </PivotSet>
    

    PIVOT XML 動的列定義をサポートします( for source in(select different t.source from tst_data t) )ただし、XMLデータを返します。 Extractvalue およびxmltable 関数を使用すると、サーバー側のXMLから特定の列を照会できますが、事前にフィールド名を指定する必要があります。したがって、クライアント側で解析することを想定しています。

    DB層ですべてを実行したい場合は、別のアプローチがあります。 PIVOT (XMLではなく)('INTERNET'、'DEMO'、'COM'、...)のソースに列名が必要です 。このようなクエリを生成して、カーソルを返すことができます。 クライアント側へ:

    CREATE OR REPLACE FUNCTION FUNCTION1 RETURN SYS_REFCURSOR AS 
     cur sys_refcursor;
    BEGIN
      open cur for 'select * from dual'; // generate PIVOT query here
      RETURN cur;
    END FUNCTION1;
    

    (サーバー側の)カーソルから単純な型なしクエリを作成する方法がわからないため、プレーンSQLクエリを使用する場合は、次の2つの手順で実行します。

    1. PL/SQL関数で名前付き列を使用してPIVOTクエリを生成します。
    2. クライアントからクエリを実行します。


    1. JPAネイティブクエリは単一のオブジェクトを取得します

    2. Opencart管理者側の空白ページ

    3. Oracle Invoke REST Service from pl / sql

    4. SQLiteでRandomBlob()がどのように機能するか