如果一个条件为空,则获取所有行

时间:2019-08-29 20:57:42

标签: sql oracle plsql

我有一个问题。我试图创建一个查询,在其中我要传递一个参数p_effective_date。如果我们没有在此参数中传递任何值,那么我希望整个查询在没有此条件的情况下执行。

p_effective_date传递为null,然后仍应运行查询以获取输出。

如果p_effective_date为null,则不应考虑条件p aam.effective_start_date > p_effective_date

SELECT DISTINCT PAAM.ASSIGNMENT_NUMBER "Assignment Number",
paam.action_code    

FROM 
PER_ASSIGNMENT_EXTRA_INFO_M PAEI,
PER_ALL_ASSIGNMENTS_M PAAM

WHERE 1=1
and PAAM.ASSIGNMENT_ID= PAEI.ASSIGNMENT_ID
and paam.assignment_type ='E'
and paei.INFORMATION_TYPE='Tal'
and paam.assignment_status_type='ACTIVE'
And paam.effective_start_date >  p_effective_date
AND TRUNC(SYSDATE) between PAAM.EFFECTIVE_START_DATE AND PAAM.EFFECTIVE_END_DATE
AND TRUNC(SYSDATE) between PAEI.EFFECTIVE_START_DATE AND PAEI.EFFECTIVE_END_DATE

1 个答案:

答案 0 :(得分:0)

这听起来像是NVL功能的工作。 NVL测试是否为空,如果该值为空,则将其替换为另一个值(例如零)。

SELECT DISTINCT PAAM.ASSIGNMENT_NUMBER "Assignment Number",
paam.action_code    

FROM 
PER_ASSIGNMENT_EXTRA_INFO_M PAEI,
PER_ALL_ASSIGNMENTS_M PAAM

WHERE 1=1
and PAAM.ASSIGNMENT_ID= PAEI.ASSIGNMENT_ID
and paam.assignment_type ='E'
and paei.INFORMATION_TYPE='Tal'
and paam.assignment_status_type='ACTIVE'
And paam.effective_start_date >  NVL(p_effective_date,0)
AND TRUNC(SYSDATE) between PAAM.EFFECTIVE_START_DATE AND PAAM.EFFECTIVE_END_DATE
AND TRUNC(SYSDATE) between PAEI.EFFECTIVE_START_DATE AND PAEI.EFFECTIVE_END_DATE

由于paam.effective_start_date > 0始终为true(前提是paam.effective_start_date本身永不为null),因此,当paam.effective_start_date为null时,此WHERE子句将不消除任何行,与不存在该子句的效果相同完全没有请记住,您不必在NVL函数中使用0,您可以将p_effective_date替换为您知道的始终小于paam.effective_start_date的日期,或将其替换为任何其他值,只要它返回正确的结果即可。在您的数据上。