如何在Oracle中从OR条件中获取数据

f8rj6qna  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(132)

我有三个参数。Fromdate,todate和policy number。其中fromdate和todate是必填参数,policy number是可选参数。
1.如果我只选择from date和to date(不选择policy number),我将获得daterange中的所有policy number详细信息。2.如果我还选择from date、to date和policy number,我将只获得daterange中的特定policy number详细信息。但获得daterange中的所有policy number详细信息
我得到了所有的保险单号码的细节。但我期待特定的保险单号码细节enter image description here

c86crjj0

c86crjj01#

目前,您有一个OR,这意味着日期范围或策略编号可以匹配(但也请参阅优先级规则)。
使用固定值,您需要:

WHERE CP.PAYMENT_REF_DATE >= DATE '2021-10-01'
AND CP.PAYMENT_REF_DATE < DATE '2023-11-14'
AND pm.policy_number='605000057'

字符串
我已经将'01-10-2023'这样的字符串值更改为实际日期,这样你就不会依赖于隐式转换和NLS设置;并将范围的结束更改为第二天-这意味着你不需要TRUNC()列值。但是对任何一个都这样做意味着它不能在该列上使用普通索引,因为函数正在应用。
更一般地说,如果你将值作为参数传递,你可以这样做:

WHERE CP.PAYMENT_REF_DATE >= P_FROM_DATE
AND CP.PAYMENT_REF_DATE < P_TO_DATE
AND (P_POLICY_NUMBER IS NULL OR pm.policy_number = P_POLICY_NUMBER)


提供P_FROM_DATE参数值作为DATE '2023-10-01'的等效值,P_DATE_TO作为DATE '2023-11-14'P_POLICY_NUMBER作为所需的特定策略。如果为null,则OR条件的第一部分始终匹配,您将看到任何策略的数据(当然,取决于日期范围);如果它不为空,那么OR的第二部分将只匹配您提供的特定策略,因此您将只看到该策略的数据。
如果你仍然想像在原始查询中那样将结束日期作为DATE '2023-11-13'传递,那么你可以向它添加一个:

WHERE CP.PAYMENT_REF_DATE >= P_FROM_DATE
AND CP.PAYMENT_REF_DATE < P_TO_DATE + 1
AND (P_POLICY_NUMBER IS NULL OR pm.policy_number = P_POLICY_NUMBER)


仍然可以给予13日任何时候的所有细节
CP.PAYMENT_REF_DATE < P_TO_DATE + 1等效于TRUNC(CP.PAYMENT_REF_DATE) <= P_TO_DATE,但不需要将该函数应用于该列中的每个日期值以查找匹配的行。

相关问题