使用'案例时出现问题'在'其中'子句sql server

时间:2016-05-13 06:22:09

标签: sql-server database sql-server-2008

在sql查询的where子句中使用case时,它不起作用。

问题:

我有两个名为TblEmployee和TblAssociate的表。两个表包含常用列PeriodId,EmpId和AssociateId。我的要求是从中获取值 应排除TblEmployee与来自TblAssociate的EmpId和AssociateId的组合。排除应基于PeriodId条件。

If(@PeriodID<50)
BEGIN
  SELECT * 
  FROM TblEmployee 
  WHERE (EmpId+AssociateId) NOT IN (SELECT EmpId+AssociateId FROM TblAssociate)
END
ELSE
BEGIN
  SELECT * 
  FROM TblEmployee 
  WHERE (EmpId) NOT IN (SELECT EmpId FROM TblAssociate)
END

上面的代码正在运行,但我需要避免IF-ELSE条件,并且我希望在&#39;情况下使用&#39;在where子句中。请帮助

3 个答案:

答案 0 :(得分:2)

试试这个:

infile = [
"lots of words",                        # lots at index 0, words at index 2
"many many work words",                 # many at index 0, many at index 1, work at index 2, words at index 3
"how come this picture lots work",      # lots at index 4, work at index 5
"poem poem more words that rhyme"       # words at index 3
]

你说你的代码工作正常,但这很奇怪,因为将id值加在一起并没有多大意义。无论如何,上述语句产生的结果等同于最初发布的代码。

答案 1 :(得分:0)

您可以在AND-OR子句中使用WHERE组合。此外,您不应该使用+,因为它可能会导致错误的结果。您可以将查询重写为:

SELECT e.*
FROM TblEmployee e
WHERE
    (
        @PeriodID < 50 
        AND NOT EXISTS(
            SELECT 1 
            FROM TblAssociate a 
            WHERE 
                a.EmpId = e.EmpId
                AND a.AssociateId = e.AssociateId
        )
    )
    OR 
    (
        @PeriodID >= 50 
        AND NOT EXISTS(
            SELECT 1 
            FROM TblAssociate a 
            WHERE a.EmpId = e.EmpId
        )
    )

答案 2 :(得分:0)

添加ID并不能保证唯一性。例如,如果EmpId为5且AssociateId为6,那么EmpId + AssociateId = 11,而EmpId + AssociateId = 11甚至如果EmpId为6且AssociateId为5.在下面的查询中,我确保子查询将在找到第一条记录时停止搜索并返回单个记录,其值为{{ 1}}。当且仅当1在结果中时,我们才选择员工。在子查询中,我们首先检查操作数,然后检查我们是否处于必须检查1或者匹配的时间段内。

AssociateId