Στο Oracle Analytics, οι δηλώσεις CASE συχνά χρησιμοποιούνται όταν γίνεται "διακλάδωση" ενός υπολογισμού με βάση μια τιμή μεταβλητής. Όταν υπάρχει μια παραπομπή σε μια μεταβλητή σε μια δήλωση CASE, είναι προτιμότερο να χρησιμοποιήσετε τη συνάρτηση IndexCol στη θέση της, για να βελτιώσετε την αποδοτικότητα του κώδικα SQL που δημιουργείται. Αυτό το θέμα περιγράφει τη συνάρτηση IndexCol και πότε να τη χρησιμοποιείτε.
Πληροφορίες για τη συνάρτηση IndexCol
Χρησιμοποιείτε τη συνάρτηση IndexCol όταν οι στήλες ή οι τιμές σε έναν υπολογισμό διαφέρουν ανάλογα με την τιμή μιας μεταβλητής περιόδου λειτουργίας, χώρου αποθήκευσης ή παρουσίασης.
Η σύνταξη της συνάρτησης IndexCol είναι:
INDEXCOL(<<integer_literal>>, <<expr_list>>)
Όπου το πρώτο όρισμα αναλύεται σε ακέραιο αριθμό και τα στοιχεία που αποτελούν το <<expr_list>> αντιστοιχούν στον αριθμό των πιθανών τιμών του πρώτου ορίσματος. Ένα από αυτά τα στοιχεία στη συνέχεια χρησιμοποιείται στη δήλωση SQL με βάση την τιμή του πρώτου ορίσματος.
Για παράδειγμα, αν το όρισμα <<integer_literal>> έχει τρεις πιθανές τιμές, τότε πρέπει να υπάρχουν τρία ορίσματα στο όρισμα <<expr_list>> , ένα για κάθε πιθανή τιμή του <<integer_literal>>.
Το πρώτο όρισμα συχνά βασίζεται στην τιμή μιας μεταβλητής περιόδου λειτουργίας ή μιας δήλωσης CASE αναφορικά με μεταβλητές. Μπορείτε να μοντελοποιήσετε τη συνάρτηση IndexCol στο αρχείο χώρου αποθήκευσης (RPD) ή απευθείας σε μια στήλη αναφοράς. Μπορείτε να δημιουργήσετε πολλές ένθετες συναρτήσεις IndexCol για να σχηματίσετε μια μεμονωμένη δήλωση.
Πλεονεκτήματα της συνάρτησης IndexCol
Ένας υπολογισμός που χρησιμοποιεί μια δήλωση <<case when>> προωθείται ολόκληρος στον κώδικα φυσικής SQL. Συγκριτικά, η συνάρτηση IndexCol προωθεί προς τα κάτω μόνο την απαιτούμενη στήλη ή έκφραση στη βάση δεδομένων. Αυτό οφείλεται στο γεγονός ότι η συνάρτηση IndexCol αξιολογείται πριν δημιουργηθεί ο κώδικας φυσικής SQL.
Όταν συνδυάζεται με μηνύματα προτροπής μεταβλητών, τα οποία επιτρέπουν την επιλογή σε μια λίστα τιμών, μπορείτε να τροποποιήσετε σημαντικά τη δομή αναφοράς χωρίς αυξημένο κόστος στην απόδοση.
Ένα μειονέκτημα της συνάρτησης IndexCol είναι ότι δεν μπορείτε να τη χρησιμοποιήσετε με τελεστή like στους υπολογισμούς ακεραίων, μολονότι μπορείτε να χρησιμοποιήσετε τελεστή like στη λίστα εκφράσεων. Αν ένας υπολογισμός ακεραίων απαιτεί τελεστή like, πρέπει να χρησιμοποιήσετε στη θέση της μια δήλωση CASE.
Παράδειγμα
Ας υποθέσουμε ότι υπάρχει μια μεταβλητή περιόδου λειτουργίας που ονομάζεται PREFERRED_CURRENCY, η οποία ορίζει το προτιμώμενο νόμισμα για έναν χρήστη. Στη συνέχεια, με βάση την τιμή της μεταβλητής περιόδου λειτουργίας, το Εισόδημα εμφανίζεται στο νόμισμα που καθορίστηκε από τον χρήστη.
Δημιουργήθηκαν δύο υπολογισμοί για να επιστρέψουν το σωστό νόμισμα με βάση την τιμή της μεταβλητής περιόδου λειτουργίας.
Ο πρώτος χρησιμοποιεί μια δήλωση CASE, όπως αυτή:
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Ο δεύτερος χρησιμοποιεί τη συνάρτηση IndexCol, ως εξής:
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")Επειδή το πρώτο όρισμα της συνάρτησης IndexCol πρέπει να αναλυθεί σε ακέραιο, χρησιμοποιείται μια δήλωση CASE για την ανάλυση.
Όταν εκτελείται ένα ερώτημα χρησιμοποιώντας τον υπολογισμό της δήλωσης CASE, ολόκληρη η δήλωση CASE προωθείται προς τα κάτω στη βάση δεδομένων, επειδή η δήλωση CASE αξιολογείται κατά τον χρόνο εκτέλεσης. Σε ορισμένες περιπτώσεις, αυτό δημιουργεί προβλήματα με τη λειτουργία βελτιστοποίησης.
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Βιβλία εργασίας και IndexCol
Μπορείτε να χρησιμοποιήσετε τη συνάρτηση IndexCol σε βιβλία εργασίας.
Σε αυτό το παράδειγμα, η συνάρτηση IndexCol χρησιμοποιείται για να αλλάξετε τον βαθμό λεπτομερειών περιόδου σε μια απεικόνιση:
IndexCol. Σε αυτή την περίπτωση ο υπολογισμός είναι:
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")