对一个 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')
我已经为数据中可能发生的三种情况创建了三种查找函数。这些函数中的每一个都应该 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')