Sql 如果一个条件为null,则获取所有行
我有个问题。我正在尝试创建一个查询,其中我正在传递参数p_生效日期。如果我们不在这个参数中传递任何值,那么我希望在没有这个条件的情况下执行整个查询 i、 e.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\u生效日期
传递为空,则仍应运行查询以获取输出
如果p_生效日期为空,则不应考虑条件paam.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