U servisu Oracle Analytics, naredbe CASE
često se upotrebljavaju u slučaju grananja izračuna temeljem vrijednosti varijable. Ako je varijabla navedena u naredbi CASE
, preporučujemo upotrebu funkcije IndexCol
radi poboljšanja učinkovitosti generiranog SQL koda. U ovoj je temi opisana funkcija IndexCol
i kada je upotrijebiti.
Više o funkciji IndexCol
Funkciju IndexCol
upotrijebite ako stupci ili vrijednosti izračuna odstupaju u ovisnosti o vrijednosti sesije, repozitorija ili prezentacijske varijable.
Sintaksa funkcije IndexCol
::
INDEXCOL(<<integer_literal>>, <<expr_list>>)
Gdje se prvi argument prebacuje u cjelobrojnu vrijednost, a stavke koje tvore <<expr_list>>
odgovaraju broju mogućih vrijednosti prvog argumenta. Jedna od tih stavki zatim se upotrebljava u SQL naredbi temeljem vrijednosti prvog argumenta.
Npr., ako argument <<integer_literal>>
ima tri moguće vrijednosti, u argumentu <<expr_list>>
moraju postojati tri argumenta, po jedan za svaku moguću vrijednost <<integer_literal>>.
Prvi se argument često temelji na vrijednosti varijable sesije ili naredbe CASE
u odnosu na varijable. Funkciju IndexCol
možete modelirati u datoteci repozitorija (RPD) ili izravno u stupcu izvješća. Možete ugnijezditi više funkcija IndexCol
kako biste oblikovali jednu naredbu.
Prednosti funkcije IndexCol
Izračun s pomoću naredbe <<case when>>
u potpunosti se prosljeđuje u fizički SQL kôd. U odnosu na to, funkcija IndexCol
se prosljeđuje prema dolje samo za traženi stupac ili izraz u bazi podataka. Razlog je u tome što se funkcija IndexCol
procjenjuje prije generiranja fizičkog SQL koda.
U slučaju kombiniranja s odzivnicima varijabli, koji omogućavaju odabir na popisu vrijednosti, moći ćete u značajnoj mjeri izmijeniti strukturu izvješća, bez značajnog ugrožavanja brzine izvedbe.
Jedan nedostatak funkcije IndexCol
je nemogućnost njezine upotrebe s naredbom like
kod izračunavanja cijelih brojeva, premda like
možete upotrebljavati u popisu izraza. Ako izračunavanje cijelih brojeva zahtijeva like
, umjesto toga morate upotrijebiti naredbu CASE
.
Primjer
Pretpostavimo kako postoji varijabla sesije naziva PREFERRED_CURRENCY
koja postavlja željenu valutu za korisnika. Zatim će se temeljem vrijednosti varijable sesije prikazati prihod u valuti koju definira korisnik.
Dva izračuna stvorena su kako bi vratila odgovarajuću valutu temeljem vrijednosti varijable sesije.
Prvi upotrebljava naredbu CASE
, ovako:
CASE WHEN VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY") = 'USD' THEN "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Usd" WHEN VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY") = 'EUR' THEN "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Eur" WHEN VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY") = 'AUD' THEN "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Aud" ELSE NULL END
Drugi upotrebljava funkciju IndexCol
, ovako:
INDEXCOL( CASE VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY") WHEN 'USD' THEN 0 WHEN 'EUR' THEN 1 WHEN 'AUD' THEN 2 END , "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Usd", "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Eur", "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Aud")
Budući da se prvi argument funkcije IndexCol
mora preobraziti u cjelobrojnu vrijednost, za razrješenje se upotrebljava naredba CASE
.
Nakon pokretanja upita s pomoću izračuna naredbe CASE
, čitava naredba CASE
proslijedit će se prema dolje u bazi podataka, budući da se naredba CASE
procjenjuje pri izvođenju. To u određenim slučajevima uzrokuje probleme s optimizatorom.
WITH SAWITH0 AS (select sum(case when 'USD' = 'USD' then T42437.Revenue_Usd when 'EUR' = 'USD' then T42437.Revenue_Eur when 'AUD' = 'USD' then T42437.Revenue_Aud else NULL end ) as c1, T42412.Office_Dsc as c2, T42412.Office_Key as c3 from BISAMPLE.SAMP_OFFICES_D T42412 /* D30 Offices */ , BISAMPLE.SAMP_REVENUE_CURR_F T42437 /* F19 Rev. (Converted) */ where ( T42412.Office_Key = T42437.Office_Key ) group by T42412.Office_Dsc, T42412.Office_Key), SAWITH1 AS (select 0 as c1, D1.c2 as c2, D1.c1 as c3, D1.c3 as c4 from SAWITH0 D1) select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3 from ( select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3 from SAWITH1 D1 order by c2 ) D1 The same query run using the IndexCol function pushes down only the expression needed to satisfy the query, because the IndexCol function is resolved prior to SQL generation. This helps avoid issues with the Optimizer. WITH SAWITH0 AS (select sum(T42437.Revenue_Usd) as c1, T42412.Office_Dsc as c2, T42412.Office_Key as c3 from BISAMPLE.SAMP_OFFICES_D T42412 /* D30 Offices */ , BISAMPLE.SAMP_REVENUE_CURR_F T42437 /* F19 Rev. (Converted) */ where ( T42412.Office_Key = T42437.Office_Key ) group by T42412.Office_Dsc, T42412.Office_Key), SAWITH1 AS (select 0 as c1, D1.c2 as c2, D1.c1 as c3, D1.c3 as c4 from SAWITH0 D1) select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3 from ( select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3 from SAWITH1 D1 order by c2 ) D1
Radne knjige i IndexCol
Funkciju IndexCol
možete upotrebljavati u radnim knjigama.
U tom primjeru, funkcija IndexCol
služi za promjenu granularnosti razdoblja u vizualizaciji:
IndexCol
. Ovo je izračun:
indexcol(case when @parameter("Time Selector Value")('Month')='Month' then 0 else 1 end, "HCM - Workforce Core"."Time"."Month Name", "HCM - Workforce Core"."Time"."Quarter")