sql >> Database >  >> RDS >> Oracle

Oracle SQL - dynamische case-instructie

U hebt een PIVOT-functie nodig met dynamische kolommendefinitie. De eenvoudigste manier is 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)
)  

Nadat u XML-gegevens moet verwerken:

<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 ondersteunt de definitie van dynamische kolommen (for source in (select distinct t.source from tst_data t) ) maar het retourneert XML-gegevens. Extractvalue en xmltable functies maken het mogelijk om bepaalde kolommen uit de XML aan de serverzijde op te vragen, maar u moet van tevoren veldnamen opgeven. Dus ik neem aan dat ik het aan de kant van de klant moet ontleden.

Als u alles op de DB-laag wilt doen, is er een andere benadering. PIVOT (niet XML) vereist kolomnamen for source in ('INTERNET', 'DEMO', 'COM', ...) . Het is mogelijk om zo'n zoekopdracht te genereren en een cursor te retourneren naar klantzijde:

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;

Ik ken geen enkele methode om een ​​eenvoudige, niet-getypte query te maken vanaf de cursor (aan de serverzijde), dus als je een gewone SQL-query wilt gebruiken, doe dat dan in twee stappen:

  1. Genereer een PIVOT-query met benoemde kolommen in de PL/SQL-functie;
  2. Voer de query van uw klant uit.


  1. probleem met GROUP_CONCAT in JOIN-query mysql

  2. Hoe CURTIME() werkt in MariaDB

  3. om een ​​bepaalde rij uit de database en de html-tabel te verwijderen op de bijbehorende knop klik

  4. Query's uitvoeren op grote dataset op Join (15+ miljoen rijen)