sql >> Databasteknik >  >> RDS >> Oracle

Oracle SQL - dynamisk case-sats

Du behöver en PIVOT-funktion med dynamisk kolumndefinition. Det enklaste sättet är 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)
)  

När du behöver bearbeta XML-data:

<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 stöder dynamisk kolumndefinition (for source in (select distinct t.source from tst_data t) ) men det returnerar XML-data. Extractvalue och xmltable funktioner tillåter att fråga specifika kolumner från XML på serversidan men du måste ange fältnamn i förväg. Så jag antar att jag analyserar det på klientsidan.

Om du vill göra allt på DB-layer finns det ett annat tillvägagångssätt. PIVOT (inte XML) kräver kolumnnamn for source in ('INTERNET', 'DEMO', 'COM', ...) . Det är möjligt att generera en sådan fråga och returnera en markör till klientsidan:

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;

Jag vet inte någon metod för att skapa en enkel otypad fråga från markören (på serversidan), så om du vill använda en vanlig SQL-fråga gör det i två steg:

  1. Generera en PIVOT-fråga med namngivna kolumner i PL/SQL-funktionen;
  2. Kör frågan från din klient.


  1. mySQL>> Lägga till HREF-länkar till en distinkt GROUP_CONCAT

  2. mysql lagrad procedur med INTO OUTFILE

  3. mysql matcha/mot

  4. PL/SQL utskriftsreferens markör returneras av en lagrad procedur