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

Oracle SQL - dynamisk case-sætning

Du har brug for en PIVOT-funktion med dynamisk kolonnedefinition. Den enkleste måde er 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 skal behandle 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 understøtter definition af dynamiske kolonner (for source in (select distinct t.source from tst_data t) ), men det returnerer XML-data. Extractvalue og xmltable funktioner tillader at forespørge bestemte kolonner fra XML på serversiden, men du skal angive feltnavne på forhånd. Så jeg går ud fra at analysere det på klientsiden.

Hvis du vil gøre alt på DB-lag, er der en anden tilgang. PIVOT (ikke XML) kræver kolonnenavne for source in ('INTERNET', 'DEMO', 'COM', ...) . Det er muligt at generere en sådan forespørgsel og returnere en markør til klientsiden:

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;

Jeg kender ikke nogen metode til at oprette en simpel utypeforespørgsel fra markøren (på serversiden), så hvis du ønsker at bruge en almindelig SQL-forespørgsel, gør det i to trin:

  1. Generer en PIVOT-forespørgsel med navngivne kolonner i PL/SQL-funktionen;
  2. Kør forespørgslen fra din klient.


  1. Skemamønstersøgning

  2. MySQL adgangskode funktion

  3. Trigger genkender ikke tabel (Trigger for at opdele indhold af NEW.values ​​i flere rækker for at indsætte i en anden tabel)

  4. Begrænsning af samtidige brugersessioner for et specifikt login i SQL Server