2012-12-13 56 views
5

下面是条件我在那里时,我想对特定用户如果在SQL查询的WHERE子句

where Completion_Date>= '11/01/2011' 
and Completion_Date<= '12/11/2012' 
and System_user_id = 1234 

及以下数据查询的WHERE子句是WHERE子句时,我想拉的所有数据用户:

where Completion_Date>= '11/01/2011' 
and Completion_Date<= '12/11/2012' 

因为我不想2个独立的查询,有没有办法添加在where子句,这样我可以使用单一的查询,并根据输入(即SYSTEM_USER_ID),它会决定是否条件在查询中添加额外的条件。 当我想为所有用户的数据&发送一个特定用户的system_user_id将被发送时,我将发送-1。

+0

我已经更新了结果和答案请参考SQLFiddle,请看看。 :)如果你需要,我仍然可以保留早期版本的答案虽然..;) – bonCodigo

+0

你说你不想在问题中2个单独的查询,但然后用两个单独的查询标记答案作为答案。 –

回答

7

你可以试试下面的方法在这一个变化。

更新查询

declare @userid int = -1 
if (@userid = -1) 
    BEGIN 

    SELECT * FROM mytable 
    where Completion_Date>= '11/01/2011' 
    and Completion_Date<= '12/11/2012' 
    and userid in 
     (select distinct userID from mytable) 
    end 
ELSE 
    BEGIN 

    SELECT * FROM mytable 
    where Completion_Date>= '11/01/2011' 
    and Completion_Date<= '12/11/2012' 
    and userid = @userid 

end; 

结果:

USERID NAME COMPLETION_DATE 
123  john 2011-11-01 
125  tim  2011-11-02 
127  ron  2011-11-08 

要查看特定用户:


另一种方法

最新评论后更新从OP

查询:

DECLARE @uid int = -1 
SELECT 
* 
FROM mytable 
WHERE 
(CASE 
    WHEN @uid <> -1 THEN @uid 
    ELSE userid 
    END 
) = userid 

and Completion_Date>= '11/01/2011' 
    and Completion_Date<= '12/11/2012' 
; 

结果:当@uid = -1

USERID NAME COMPLETION_DATE 
123  john 2011-11-01 
125  tim  2011-11-02 
127  ron  2011-11-08 

请评论,如果你已经尝试了这一点:)

+0

它会给出“THEN”附近的错误 –

+0

@avinashchavan你可以运行,然后;) – bonCodigo

+0

Thanx的帮助! –

5

尝试:

WHERE ((@System_user_id = -1) 
    AND (Completion_Date >= '11/01/2011') 
    AND (Completion_Date <= '12/11/2012')) 
OR ((@System_user_id <> -1) 
    AND (System_user_id = @System_user_id) 
    AND (Completion_Date >= '11/01/2011') 
    AND (Completion_Date <= '12/11/2012')) 

使用公用表表达式(SQL Fiddle

;WITH CompletionDates AS 
(
    SELECT * 
    FROM MyTable 
    WHERE Completion_Date >= '11/01/2011' 
    AND Completion_Date <= '12/11/2012' 
) 
SELECT * 
FROM CompletionDates 
WHERE (@System_user_id = -1) OR (System_user_id = @System_user_id) 
+0

+1为你@Diamond Geezer;) – bonCodigo

+0

@bonCodigo谢谢。通常我会使用IF块进行编码(就像在你的答案中一样),因为它的意图更清晰。如果有许多可选参数,那么在WHERE子句中执行“IF”语句会变得难以阅读和调试。 –