I Oracle Analytics bruges CASE
-sætninger ofte, når en beregning forgrenes på basis af en variabel værdi. Når der refereres til en variabel i en CASE
-sætning, er det bedst i stedet at bruge funktionen IndexCol
for at forbedre den genererede SQL-kodes effektivitet. Dette emne beskriver funktionen IndexCol
, og hvornår den skal bruges.
Om funktionen IndexCol
Du bruger funktionen IndexCol
, når kolonnerne eller værdierne i en beregning varierer alt efter værdien for en sessions-, informationsbase- eller præsentationsvariabel.
Syntaksen for funktionen IndexCol
er:
INDEXCOL(<<integer_literal>>, <<expr_list>>)
Hvor det første argument fortolkes til et heltal, og de elementer, der udgør <<expr_list>>
, svarer til antallet af mulige værdier for det første argument. Et af disse elementer bruges derefter i SQL-sætningen på basis af værdien af det første argument.
Hvis argumentet <<integer_literal>>
for eksempel har tre mulige værdier, skal der være tre argumenter i argumentet <<expr_list>>
, ét for hver mulig værdi for <<integer_literal>>.
Det første argument er ofte baseret på værdien af en sessionsvariabel eller en CASE
-sætning med reference til variabler. Du kan modellere funktionen IndexCol
i informationsbasefilen (RPD) eller direkte i en rapportkolonne. Du kan indlejre flere IndexCol
-funktioner for at danne en enkelt sætning.
Fordele ved funktionen IndexCol
En beregning, der anvender en <<case when>>
-sætning, skubbes til den fysiske SQL-kode i sin helhed. Funktionen IndexCol
skubber derimod kun den påkrævede kolonne eller det påkrævede udtryk ned til databasen. Det skyldes, at funktionen IndexCol
evalueres, før den fysiske SQL-kode genereres.
Du kan modificere rapportstrukturen betydeligt, uden at det går ud over ydeevnen, når den kombineres med variabelprompter, hvilket giver mulighed for valg på en værdiliste.
Én ulempe ved funktionen IndexCol
er, at du ikke kan bruge den sammen med like
i heltalsberegninger, selvom du kan bruge like
på listen over udtryk. Hvis en heltalsberegning kræver et like
, skal du bruge en CASE
-sætning i stedet.
Eksempel
Antag, at der er en sessionsvariabel med navnet PREFERRED_CURRENCY
, der angiver en brugers foretrukne valuta. Indtægt vises derefter i den valuta, der er angivet af brugeren, på basis af værdien af sessionsvariablen.
Der er oprettet to beregninger, som returnerer den korrekte valuta på basis af værdien af sessionsvariablen.
Den første bruger en CASE
-sætning som vist nedenfor:
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
Den anden bruger funktionen IndexCol
som vist nedenfor:
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")
Da det første argument for funktionen IndexCol
skal fortolkes til et heltal, bruges der en CASE
-sætning til fortolkningen.
Når en forespørgsel køres ved hjælp af en beregning af CASE
-sætningen, skubbes CASE
-sætningen i sin helhed ned til databasen, da CASE
-sætningen evalueres ved runtime. I nogle tilfælde skaber dette problemer med optimizer.
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
Projektmapper og IndexCol
Du kan bruge funktionen IndexCol
i projektmapper.
I dette eksempel bruges funktionen IndexCol
til at ændre periodedetaljeringsniveauet i en visualisering:
IndexCol
. Her er beregningen:
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")