我如何在 PLSQL 中正确获取此 CASE 语句?

How do i get this CASE statement right in PLSQL?

我在尝试 运行 这个请求时收到 ORA- 00936 missing expression error near > symbol :

SELECT contract_ref_no,
       component
FROM   some_table
WHERE  Contract_ref_no = '123'
AND    component = 'ABC'
AND end_date
   (CASE WHEN NVL(l_neg_esn_allowed,'N') = 'N' 
    THEN 
       > greatest(nvl(l_conv_eff_date, l_contract_vdate),
                l_contract_vdate)
    ELSE                 
       >=
     greatest(nvl(l_conv_eff_date, l_contract_vdate),
                         l_contract_vdate)  
    END) 

我该如何解决?

您可以将案例陈述更改为 -

SELECT contract_ref_no,
       component
  FROM some_table
 WHERE Contract_ref_no = '123'
   AND component = 'ABC'
   AND CASE WHEN NVL(l_neg_esn_allowed,'N') = 'N'
                 AND end_date > greatest(nvl(l_conv_eff_date, l_contract_vdate),
                                         l_contract_vdate) THEN
                 1
            WHEN end_date >= greatest(nvl(l_conv_eff_date, l_contract_vdate),
                                      l_contract_vdate) THEN
                 1
       END = 1;

您编写的 SQL 查询有语法错误。

THEN > something 行不通:优于什么?与>=之后相同,优于或等于什么?

所以,你应该有类似 column > value 的东西,比如你会有 column = valuecolumn LIKE 'my val'

最后,我建议你使用这个代码:

SELECT contract_ref_no,
       component
FROM   some_table
WHERE  Contract_ref_no = '123'
AND    component = 'ABC'
AND end_date
   (CASE WHEN NVL(l_neg_esn_allowed,'N') = 'N' 
    THEN some_date > greatest(nvl(l_conv_eff_date, l_contract_vdate),
                l_contract_vdate)
    ELSE some_date >= greatest(nvl(l_conv_eff_date, l_contract_vdate),
                         l_contract_vdate)  
    END) 

根据亚里士多德的规则稍作修改,您可以写成

  • 你总是希望end_date大于你的greatest表达式

  • else 情况下 NVL(l_neg_esn_allowed,'N') != 'N' thay 可能 equal

谓词

...

AND (
end_date  >  greatest(nvl(l_conv_eff_date, l_contract_vdate), l_contract_vdate)
OR
NVL(l_neg_esn_allowed,'N') != 'N'  and  end_date = greatest(nvl(l_conv_eff_date, l_contract_vdate), l_contract_vdate)
)

和下面的谓词一样,更符合你的初衷

....
AND (
NVL(l_neg_esn_allowed,'N') = 'N' AND end_date > greatest(nvl(l_conv_eff_date, l_contract_vdate),l_contract_vdate)
OR
NVL(l_neg_esn_allowed,'N') != 'N' AND end_date >= greatest(nvl(l_conv_eff_date, l_contract_vdate),l_contract_vdate)
)