繁体   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