簡體   English   中英

是否可以在SELECT的WHERE子句中插入IF子句?

[英]Is it possible to insert an IF clause inside of a WHERE clause in a SELECT?

抱歉,如果這是一個愚蠢的問題,我是PL / SQL的新手。 我有一個PL / SQL存儲過程,可以從表中檢索數據。 有2個可選參數,可以為null。 如果它們不為null,則應成為WHERE子句的一部分。

這是SELECT:

SELECT DISTINCT PN.PART_NUMBER, PN.SHORT_CODE, DES.DESCRIPTION
FROM           MAS_PART              PN
LEFT JOIN      CF_DESCRIPTION        DES  
ON PN.LOCAL_DESCRIPTION_ID = DES.DESCRIPTION_ID              
WHERE PN.PART_CODE = 'M'
AND PN.PART_TYPE_ID = IN_PART_TYPE_ID
AND PN.PART_GROUP_ID = IN_PART_GROUP_ID
ORDER BY PN.PART_NUMBER;

這兩個變量是IN_PART_TYPE_IDIN_PART_GROUP_ID 只有當這兩個變量不是NULL時,才有任何方法可以評估WHERE子句嗎? 還是唯一的方法是使用IF子句並更改WHERE子句重復SELECT 3次?

或操作員將幫助:

SELECT DISTINCT PN.PART_NUMBER, PN.SHORT_CODE, DES.DESCRIPTION
FROM           MAS_PART              PN
LEFT JOIN      CF_DESCRIPTION        DES  
ON PN.LOCAL_DESCRIPTION_ID = DES.DESCRIPTION_ID              
WHERE PN.PART_CODE = 'M'
AND (PN.PART_TYPE_ID = IN_PART_TYPE_ID or IN_PART_TYPE_ID is null)
AND (PN.PART_GROUP_ID = IN_PART_GROUP_ID or IN_PART_GROUP_ID is null)
ORDER BY PN.PART_NUMBER;

另一種選擇是使用NVL:

SELECT DISTINCT PN.PART_NUMBER, PN.SHORT_CODE, DES.DESCRIPTION
FROM           MAS_PART              PN
LEFT JOIN      CF_DESCRIPTION        DES  
ON PN.LOCAL_DESCRIPTION_ID = DES.DESCRIPTION_ID              
WHERE PN.PART_CODE = 'M'
AND PN.PART_TYPE_ID = NVL(IN_PART_TYPE_ID, PN.PART_TYPE_ID)
AND PN.PART_GROUP_ID = NVL(IN_PART_GROUP_ID, PN.PART_GROUP_ID)
ORDER BY PN.PART_NUMBER;

但是,僅當PN.PART_TYPE_ID和PN.PART_GROUP_ID不為null時,它才有效

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM