【发布时间】:2021-11-07 04:39:57
【问题描述】:
我正在尝试在 where 子句中传递 case 语句,但似乎我遗漏了一些东西,或者在我的场景中这是不可能的,下面是我的代码
代码解释“如果 sysdate 是星期天,我想检索过去 3 天的数据,否则取昨天的数据”
FROM lea_nf1.lea_agreement_dtl c--, lea_nf1.LEA_GUARANTOR_HIRER_DTL d
WHERE
case when to_char(sysdate,'Day') = 'Sunday' then
to_char(C.DISBURSALDATE , 'mm') = to_char(sysdate-1, 'mm')
and to_char(C.DISBURSALDATE , 'yyyy') = to_char(sysdate-1, 'yyyy')
and C.DISBURSALDATE between trunc(sysdate-3) and trunc(sysdate-1)
else
to_char(C.DISBURSALDATE , 'mm') = to_char(sysdate-1, 'mm')
and (to_char(C.DISBURSALDATE , 'yyyy') = to_char(sysdate-1, 'yyyy')
and C.DISBURSALDATE < sysdate end
ORDER BY C.DISBURSALDATE desc
下面是错误
ORA-00905:缺少关键字
【问题讨论】:
-
跳过大小写表达式,改用正则AND/OR。
-
Oracle 没有布尔数据类型,这就是为什么您不能将
case表达式评估为某些谓词的结果 -
你确定你的逻辑是正确的(即使忽略代码)?如果是星期天,您想返回三天,如果不是只返回一天。既然是三对一(不是二对一),这是否意味着星期六也很特别?如果是这样,你不应该对星期六有不同的条件,而不仅仅是星期天吗?如果您告诉我们实际任务(而不仅仅是代码),我们可能会帮助您找到更简单、更优雅、更高效的解决方案。