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
ENDDrugi 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 ) D1Radne 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")