我有个问题。我正在尝试创建一个查询,其中我传递了一个参数p_effective_date。如果我们没有在这个参数中传递任何值,那么我希望在没有这个条件的情况下执行整个查询。
也就是说,p_effective_date被传递为null,那么查询仍然应该运行以获得输出。
如果p_effective_date为null,则不应考虑条件paam.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发布于 2019-08-30 23:09:54
这听起来像是NVL函数的工作。NVL测试null,如果值为null,它将其替换为另一个值(如零)。
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的日期,或者替换为任何其他值,只要它根据您的数据返回正确的结果。
https://stackoverflow.com/questions/57717644
复制相似问题