Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle SQL - istruzione case dinamica

È necessaria una funzione PIVOT con definizione di colonne dinamiche. Il modo più semplice è 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)
)  

Dopo aver bisogno di elaborare i dati 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 supporta la definizione di colonne dinamiche (for source in (select distinct t.source from tst_data t) ) tuttavia restituisce dati XML. Extractvalue e xmltable le funzioni consentono di interrogare determinate colonne dall'XML lato server ma è necessario specificare in anticipo i nomi dei campi. Quindi presumo di analizzarlo sul lato client.

Se vuoi fare tutto su DB-layer c'è un altro approccio. PIVOT (non XML) richiede i nomi delle colonne for source in ('INTERNET', 'DEMO', 'COM', ...) . È possibile generare una tale query e restituire un cursore lato cliente:

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;

Non conosco alcun metodo per creare una semplice query non digitata dal cursore (lato server), quindi se desideri utilizzare una semplice query SQL fallo in due passaggi:

  1. Genera una query PIVOT con colonne con nome nella funzione PL/SQL;
  2. Esegui la query dal tuo cliente.