有条件地评估条件 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 <> '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 配置)