Στο 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")