2016-05-13 81 views
2

在sql查詢中的where子句中使用大小寫時,它不起作用。在'where'子句中使用'case when'時發生的問題sql server

問題:

我有一個名爲TblEmployee兩個表和TblAssociate.Both表包含相同的列PeriodId,EMPID和AssociateId。我的要求是從 TblEmployee與TblAssociate EMPID和AssociateId的組合取值應excluded.And排除,應根據PeriodId condition.`

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條件,我想用「情況下」在clause.Please幫助

+1

爲什麼使用'+'而不是'AND'?這可能會導致不正確的結果。 –

回答

2

試試這個:

SELECT * 
FROM TblEmployee 
WHERE (EmpId + CASE WHEN @PeriodID<50 THEN AssociateId ELSE 0 END) NOT IN 
     (SELECT EmpId + CASE WHEN @PeriodID<50 THEN AssociateId ELSE 0 END FROM TblAssociate) 

你說你的代碼的工作,但是這是相當奇怪的,因爲它不」增加想象力是很有意義的r id值。無論如何,上述聲明產生的結果與最初發布的代碼相同。

0

您可以在WHERE子句中使用AND-OR組合。此外,你不應該使用+,因爲它可能導致不正確的結果。您可以將您的查詢重寫爲:

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 
     ) 
    ) 
0

添加的ID並不能保證唯一性。舉例來說,如果EmpId是5和AssociateId是6,然後EmpId + AssociateId = 11,而EmpId + AssociateId = 11即使EmpId是6和AssociateId是5.在下面的查詢,我確信,子查詢將停止搜索時找到第一條記錄並返回單個記錄,其值爲1。我們選擇員工當且僅當1是結果。在子查詢中,我們首先檢查我們確定的操作數,然後檢查我們是否不在AssociateId必須被檢查或者匹配的時期。

select * 
from TblEmployee 
where 1 in (select top 1 1 
      from TblAssociate 
      where TblEmployee.EmpId = TblAssociate.EmpId and 
      (@PeriodID >= 50 or TblEmployee.AssociateId = TblAssociate.AssociateId))