我有一些动态SQL代码,这里是一个样本:
v_RUNNING_QUERY VARCHAR2(1000);
BEGIN
v_RUNNING_QUERY := 'SELECT PBA.PTY_ID FROM PARTY.PARTY_BILLING_ACCOUNT PBA
WHERE PBA.BILLING_ACCT_SRC_ID1 = p_BILLING_ACCT_SRC_SYS
AND
PBA.BILLING_ACCT_SRC_SYS_CD = p_PBA.BILLING_ACCT_SRC_SYS_CD;
IF p_BILLING_ACCT_SRC_SYS_ID2 IS NOT NULL
THEN
v_RUNNING_QUERY := v_RUNNING_QUERY || ' AND PBA.BILLING_ACCT_SRC_ID2 = p_BILLING_ACCT_SRC_SYS_ID2';
问题是我的老板要我删除所有动态SQL。取而代之的是,我需要主要使用IF逻辑。但他也说我可以使用COALESCE。我输了...... COALESCE如何帮助解决这个问题?
答案 0 :(得分:2)
你可以得到与以下相同的逻辑:
SELECT PBA.PTY_ID
FROM PARTY.PARTY_BILLING_ACCOUNT PBA
WHERE PBA.BILLING_ACCT_SRC_ID1 = p_BILLING_ACCT_SRC_SYS AND
PBA.BILLING_ACCT_SRC_SYS_CD = p_BILLING_ACCT_SRC_SYS_CD AND
(p_BILLING_ACCT_SRC_SYS_ID2 IS NULL OR PBA.BILLING_ACCT_SRC_ID2 = p_BILLING_ACCT_SRC_SYS_ID2)
在BILLING_ACCT_SRC_ID2
之后,您似乎想要进行一些比较。
编辑:
您也可以将其命名为:
SELECT PBA.PTY_ID
FROM PARTY.PARTY_BILLING_ACCOUNT PBA
WHERE PBA.BILLING_ACCT_SRC_ID1 = p_BILLING_ACCT_SRC_SYS AND
PBA.BILLING_ACCT_SRC_SYS_CD = p_BILLING_ACCT_SRC_SYS_CD AND
PBA.BILLING_ACCT_SRC_ID2 = coalesce(p_BILLING_ACCT_SRC_SYS_ID2, PBA.BILLING_ACCT_SRC_ID2);
这使用coalesce()
,但逻辑不需要。