对一个 DIM KEY 使用两个查找函数

Using two lookup functions for one DIM KEY

我已经为数据中可能发生的三种情况创建了三种查找函数。这些函数中的每一个都应该 return 一个 account_dim_key,第一个场景从调用 table 和 returns 中获取 sr 帐户 ID 和调用数据时间,如果调用日期时间在有效开始日期和结束日期之间,第二个场景使用调用日期(无时间),第三个场景只使用帐户 ID(无日期)。如果第一个查找函数 returns a -1 那么我想使用第二个查找函数,如果 returns a -1 那么我要使用第三个查找函数。我一直在尝试在 case 语句中使用它们,但在我尝试过的所有场景中,它总是 returns 来自第二个查找函数的 dim 键(在我的 case 语句的 THEN 部分)。以这种方式在 case 语句中使用三个函数是不可能的,还是我以完全错误的方式进行处理。

查找 1

CREATE OR REPLACE FUNCTION LOOKUP_D_ACCT(p_acct_id   IN VARCHAR2, p_date IN DATE)
   RETURN NUMBER
   PARALLEL_ENABLE
IS
   v_dim_id   NUMBER;
BEGIN
   SELECT ACCOUNT_DIM_KEY 
     INTO v_dim_id
     FROM 
          schema.D_ACCOUNT ac
    WHERE     p_acct_id = ac.ID
              AND (p_date BETWEEN ac.EFFECTIVE_START_DT AND ac.EFFECTIVE_END_DT)
          ;

   RETURN v_dim_id;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN -1;
END LOOKUP_D_ACCT;
/

查找 2

CREATE OR REPLACE FUNCTION LOOKUP_D_ACCT_TRUNC_DT (p_acct_id   IN VARCHAR2, p_date IN DATE)
   RETURN NUMBER
   PARALLEL_ENABLE
IS
   v_dim_id   NUMBER;
BEGIN
   SELECT MAX(ACCOUNT_DIM_KEY)
     INTO v_dim_id
     FROM 
          schema.D_ACCOUNT ac
    WHERE     p_acct_id = ac.ID
                AND p_date >= TRUNC(ac.EFFECTIVE_START_DT) AND p_date <= TRUNC(ac.EFFECTIVE_END_DT)
          ;

   RETURN v_dim_id;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN -1;
END;
/

查找 3

CREATE OR REPLACE FUNCTION LOOKUP_D_ACCT_NO_DT (p_acct_id   IN VARCHAR2)
   --LOOKUP FUNCTION TO PASS THROUGH FIELD_ALIGN_DIM_ID WITH DATE CRITERIA
   --new one for practice load
   --dated 8/31
   RETURN NUMBER
   PARALLEL_ENABLE
IS
   v_dim_id   NUMBER;
BEGIN
   SELECT ACCOUNT_DIM_KEY
     INTO v_dim_id
     FROM 
          schema.D_ACCOUNT ac
    WHERE     p_acct_id = ac.ID
          ;

   RETURN v_dim_id;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN -1;
END;
/

我的程序 select 如下所示:

SELECT cl.id,
       cl.account_vod__c,
       cl.call_date_vod__c,
       cl.call_datetime_vod__c,
       (CASE
           WHEN NVL (
                   LOOKUP_D_ACCT(cl.ACCOUNT_VOD__C,
                                        CL.CALL_DATETIME_VOD__C),
                   -1) = -1
           --lookup 1
           THEN
              NVL (
                 LOOKUP_ACCT_TRUNC_DT (cl.ACCOUNT_VOD__C,
                                          CL.CALL_DATE_VOD__C),
                 -1)
           --lookup 2
           WHEN NVL (
                   LOOKUP_ACCT_TRUNC_DT (cl.ACCOUNT_VOD__C,
                                            CL.CALL_DATE_VOD__C),
                   -1) = -1
           THEN
              NVL (LOOKUP_D_ACCT_NO_DT (cl.ACCOUNT_VOD__C), -1)
           --lookup 3
           ELSE -3
        END)
          AS ACCOUNT_DIM_KEY,
       LOOKUP_D_ACCT_VEEVA (cl.ACCOUNT_VOD__C, CL.CALL_DATETIME_VOD__C)
          AS DTIME_DIM_KEY,
       --lookup 1
       LOOKUP_ACCOUNT_DIM_TEST (cl.ACCOUNT_VOD__C, CL.CALL_DATE_VOD__C)
          AS DT_DIM_KEY,
       --lookup 2
       LOOKUP_D_ACCT_VEEVA_NO_DT (cl.ACCOUNT_VOD__C) AS NODT_DIM_KEY
  --lookup 3
  FROM schema.CALLTABLE CL
 WHERE CL.ID IN ('a043600000Bija3AAB')

我希望 'ACCOUNT_DIM_KEY' 字段始终填充查找 1、2 或 3 中的函数 enter image description here

如有任何帮助,我们将不胜感激!

如果你想传递你的所有条件链,那么你不应该使用 case 语句,而是依次检查每个条件:

if (NVL (LOOKUP_D_ACCT(cl.ACCOUNT_VOD__C, CL.CALL_DATETIME_VOD__C), -1) = -1) then 
    if (NVL ( LOOKUP_ACCT_TRUNC_DT (cl.ACCOUNT_VOD__C, CL.CALL_DATE_VOD__C), -1) = -1 ) then 
      if (NVL (LOOKUP_D_ACCT_NO_DT (cl.ACCOUNT_VOD__C), -1) = -1) then 
        -- if third func returned -1
      else 
        -- action if third case
      end if;
    else
      --action if second case
    end if;
  else
    --action if first case
end if;

UPD 当然,如果它是 SQL 而不是 PL/SQL,那么您应该使用嵌套 case,如前所述:

SELECT 
       (CASE
           WHEN NVL (
                   LOOKUP_D_ACCT(cl.ACCOUNT_VOD__C,
                                        CL.CALL_DATETIME_VOD__C),
                   -1) = -1
           --lookup 1
           THEN
              CASE
                WHEN                     
                  NVL (
                     LOOKUP_ACCT_TRUNC_DT (cl.ACCOUNT_VOD__C,
                                              CL.CALL_DATE_VOD__C),
                     -1)= -1

                THEN 
                  NVL (LOOKUP_D_ACCT_NO_DT (cl.ACCOUNT_VOD__C), -1)                 
                ELSE -3
              END
           WHEN NVL (
                   LOOKUP_ACCT_TRUNC_DT (cl.ACCOUNT_VOD__C,
                                            CL.CALL_DATE_VOD__C),
                   -1) = -1
           THEN
              NVL (LOOKUP_D_ACCT_NO_DT (cl.ACCOUNT_VOD__C), -1)
           --lookup 3
           ELSE -3
        END)
          AS ACCOUNT_DIM_KEY,
       LOOKUP_D_ACCT_VEEVA (cl.ACCOUNT_VOD__C, CL.CALL_DATETIME_VOD__C)
          AS DTIME_DIM_KEY,
       --lookup 1
       LOOKUP_ACCOUNT_DIM_TEST (cl.ACCOUNT_VOD__C, CL.CALL_DATE_VOD__C)
          AS DT_DIM_KEY,
       --lookup 2
       LOOKUP_D_ACCT_VEEVA_NO_DT (cl.ACCOUNT_VOD__C) AS NODT_DIM_KEY
  --lookup 3
  FROM schema.CALLTABLE CL
 WHERE CL.ID IN ('a043600000Bija3AAB')