2013-06-28 76 views
0

我在SQL以下SP:SQL查詢條件,其中有過濾器

ALTER PROCEDURE [dbo].[search_employee_special] 
( 
@employeruid uniqueidentifier, 
@groupuid uniqueidentifier, 
@includedependants bit = 0 
) 
AS 

DECLARE @emptyuid uniqueidentifier 
SET @emptyuid = CAST(CAST(0 AS BINARY) AS UNIQUEIDENTIFIER) 

SELECT 
    emp.id, 
    emp.name 
FROM employee emp 
WHERE emp.isactive = 1 
    AND employeruid = @employeruid 
    AND (@groupuid = @emptyuid OR emp.gropuid = @groupuid) 

這是偉大的工作與過濾器,當@groupuid是空的GUID那麼它不groupuid過濾,否則它過濾通過groupuid ...

現在,我需要的是一個有點複雜,因爲我有其他的參數組合:

ALTER PROCEDURE [dbo].[search_employee_special] 
    ( 
    @employeruid uniqueidentifier, 
    @groupuid uniqueidentifier, 
    @includedependants bit = 0 
    ) 
    AS 

     DECLARE @emptyuid uniqueidentifier 
     SET @emptyuid = CAST(CAST(0 AS BINARY) AS UNIQUEIDENTIFIER) 

     SELECT 
      emp.id, 
      emp.name 
     FROM employee emp 
     WHERE emp.isactive = 1 
      AND employeruid = @employeruid 
     --AND (@groupuid = @emptyuid OR emp.gropuid = @groupuid) 
      AND (
       (@includedependants = 0 AND 
        (@groupuid = @emptyuid 
        OR emp.groupuid = @groupuid))  
       OR emp.specialgroupuid = @groupuid) 

這不起作用 ...我需要的是,如果@includedependants = 1那麼它會過濾emp.specialgroupuid,否則它會過濾emp.groupuid。

任何線索如何解決它?我相信它的東西很簡單:)

提前感謝幫助。

回答

3
AND (
    (
     @includedependants = 0 AND 
     (@groupuid = @emptyuid OR emp.groupuid = @groupuid) 
    )  
    OR emp.specialgroupuid = @groupuid 
    ) 

OR部分將始終運行,不管的@includedependants的價值,這是我的猜測是不是你想要的。你想要的更像是什麼;

AND (
    (
     @includedependants = 0 AND 
     (@groupuid = @emptyuid OR emp.groupuid = @groupuid) 
    )  
    OR 
    (
     @includedependants = 1 AND 
     emp.specialgroupuid = @groupuid 
    ) 
    ) 
+0

令人驚歎!它效果很好 – VAAA

1

我會用一個案例。不幸的是,所需的語法使得它非常難看。

AND 1 = case when @includedependants = 1 then 
     case when emp.specialgroupuid = @groupuid then 1 else 0 end 
    else 
     case when @groupuid = @emptyuid OR emp.groupuid = @groupuid then 1 else 0 end 
    end