【问题标题】:Conditionally evaulate a condition SQL有条件地评估条件 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

【问题讨论】:

    标签: sql db2 case sybase case-when


    【解决方案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 ))
    

    【讨论】:

    • 可以简化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2017-12-18
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多