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

Sql 如果一个条件为null,则获取所有行,sql,oracle,plsql,Sql,Oracle,Plsql,我有个问题。我正在尝试创建一个查询,其中我正在传递参数p_生效日期。如果我们不在这个参数中传递任何值,那么我希望在没有这个条件的情况下执行整个查询 i、 e.p\u生效日期传递为空,则仍应运行查询以获取输出 如果p_生效日期为空,则不应考虑条件paam.effective_start_date>p_生效日期 SELECT DISTINCT PAAM.ASSIGNMENT_NUMBER "Assignment Number", paam.action_code FROM PER_ASS

我有个问题。我正在尝试创建一个查询,其中我正在传递参数p_生效日期。如果我们不在这个参数中传递任何值,那么我希望在没有这个条件的情况下执行整个查询

i、 e.
p\u生效日期
传递为空,则仍应运行查询以获取输出

如果p_生效日期为空,则不应考虑条件p
aam.effective_start_date>p_生效日期

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

这听起来像是NVL功能的工作。 NVL测试null,如果该值为null,则用另一个值(如零)替换它


由于
paam.effective\u start\u date>0
始终为真(前提是paam.effective\u start\u date本身从不为空),因此当paam.effective\u start\u date为空时,WHERE子句将不删除任何行,这与根本不存在的子句具有相同的效果。请记住,您不必在NVL函数中使用0,您可以将p_effective_date替换为您知道的始终小于paam.effective_start_date的日期或任何其他值,只要它根据您的数据返回正确的结果。

这听起来像是NVL函数的作业。 NVL测试null,如果该值为null,则用另一个值(如零)替换它


由于
paam.effective\u start\u date>0
始终为真(前提是paam.effective\u start\u date本身从不为空),因此当paam.effective\u start\u date为空时,WHERE子句将不删除任何行,这与根本不存在的子句具有相同的效果。请记住,您不必在NVL函数中使用0,您可以将p_生效日期替换为您知道的始终小于paam.effect_start_date的日期,或任何其他值,只要它根据您的数据返回正确的结果。

和(paam.effect_start_date>p_生效日期或p_生效日期为空)
您应该避免这种从多个表中选择的旧式方式,而是使用
JOIN
@daShier,您的意思是显式
JOIN
。(OP正在进行隐式连接…@jarlh,是的,显式这个术语是通过我使用关键字
JOIN
;)来暗示的。)
和(paam.effective\u start\u date>p\u effective\u date或p\u effective\u date为空)
您应该避免这种从多个表中选择的旧式方式,而是使用
连接
@daShier,您的意思是显式
连接
。(OP正在进行隐式连接…@jarlh,是的,显式这个术语是通过我使用关键字
JOIN
;)来暗示的。)
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