有条件地评估条件 SQL

Posted

技术标签:

【中文标题】有条件地评估条件 SQL【英文标题】:Conditionally evaulate a condition SQL 【发布时间】:2017-09-25 18:16:39 【问题描述】:

我有一个员工表,我使用存储过程从中检索记录,现在我需要在存储过程中添加一个条件 --

仅当employeeType='MD' 则检查是否employeeReportableIndicator='N' ,如果'N' 则不获取此记录。

这隐含的意思是——

1) 如果employeeType!='MD' 那么我应该获取记录,而不管employeeReportableIndicator 列值如何。

2)如果employeeType='MD' 和employeeReportableIndicator='Y' 获取值。

为了简化存储过程,我只是编写了一个涵盖上述条件的小查询。这是我到目前为止所尝试的

select * 
from   employee 
where  somecondition1 
and    somecondition2 
and    CASE when employeeType='MD' 
            then (CASE when employeeReportableIndicator='N' 
                       then false 
                       else true 
                  END) 
       END

上面是给我语法错误

在“else true END ) END”之后发现了一个意外的标记“END-OF-STATEMENT”。预期的标记可能包括:“”.SQLSTATE=42601

这也是我编写正确查询的方法,如果有更好的解决方案,请提出建议。我正在使用 DB2 和 Sybase

【问题讨论】:

【参考方案1】:

您不需要CASE,只需一个OR 条件:

Select  *
From    Employee
Where   SomeCondition1
And     SomeCondition2
And     
(   
    EmployeeType <> 'MD'
    Or  
    (   
        EmployeeType = 'MD'
    And EmployeeReportableIndicator = 'Y'
    )
)

【讨论】:

可以简化。 @Clockwork-Muse 需要详细说明吗?即使可以以某种方式简化,其意图也非常清楚。 最后一个条件有四种可能的情况:MD+Y、MD+N、!MD+Y、!MD+Y。如果 !MD,我们认为条件满足(不关心 Y/N),这消除了一半的表格。这仅留下 MD+Y 和 MD+N...,其中唯一不同的部分是 Y/N。此时,检查MD是否轻浮,即:AND employeeType &lt;&gt; 'MD' OR employeeReportableIndicator = 'Y'【参考方案2】:

而不是应该在 where 中使用 AND - OR 的情况

select * 
from   employee 
where  somecondition1 
and    somecondition2 
and    ( ( employeeType='MD' AND employeeReportableIndicator='Y') 
           OR ( employeeType!='MD ))

【讨论】:

可以简化。

以上是关于有条件地评估条件 SQL的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring bean 有条件地设置属性值时,SpEL 条件运算符未按预期进行评估(使用 XML 配置)

Python 会懒惰地评估 if 的条件吗? [复制]

为啥没有在动态 SQL 中评估数学条件?

Opengl着色器:如果条件错误地评估为假

有没有办法在文本字段表达式中访问SQL查询结果,以有条件地在标题带中显示它?

有条件地删除 SQL 行