2012-04-05 49 views
0

我的SQL查询如下凡在SQL子句

IF @StatusId = 10 
    BEGIN 
     SELECT 
      * 
     FROM 
     Risk AS R 
     INNER JOIN Statuses AS St ON R.Status_Id=St.Status_Id 
     WHERE 
     R.MitigationOwner = COALESCE(@MitigationOwner,R.MitigationOwner) 
     AND R.RiskFactor = COALESCE(@RiskFactor,R.RiskFactor) 
     AND R.RiskArea = COALESCE(@RiskArea,R.RiskArea) 
     AND R.AddedWhen BETWEEN 
     COALESCE(CONVERT(DATETIME, @StartDate+'00:00:00',120),R.AddedWhen) AND 
     COALESCE(CONVERT(DATETIME,@EndDate+'23:59:59',120),R.AddedWhen) 
    END 

当我只传递状态标识及所有其它变量为空,然后用NULL MitigationOwner或ModifiedDate记录不会显示.. 什么是错的这个查询?

回答

1

我相信,通过ModifiedDate你的意思是R.AddedWhen

试试这个:

SELECT 
      * 
     FROM 
     Risk AS R 
     INNER JOIN Statuses AS St ON R.Status_Id=St.Status_Id 
     WHERE 
     (R.MitigationOwner = COALESCE(@MitigationOwner,R.MitigationOwner) OR R.MitigationOwner IS NULL) 
     AND R.RiskFactor = COALESCE(@RiskFactor,R.RiskFactor) 
     AND R.RiskArea = COALESCE(@RiskArea,R.RiskArea) 
     AND (R.AddedWhen BETWEEN 
     COALESCE(CONVERT(DATETIME, @StartDate+'00:00:00',120),R.AddedWhen) AND 
     COALESCE(CONVERT(DATETIME,@EndDate+'23:59:59',120),R.AddedWhen) OR R.AddedWhen IS NULL) 
+0

谢谢...这个工作对我来说 – user1181942 2012-04-05 12:26:14

+0

@ user1181942不客气,你应该当他们解决您的问题的答案标记为接受,让别人不会有走线槽所有的答案,找到合适的人: ) – 2012-04-05 12:31:11

+0

yes..I只有4分钟后庆祝吧.. – user1181942 2012-04-05 13:00:09

4

使用形式:

... 
(R.MitigationOwner = @MitigationOwner OR @MitigationOwner IS NULL) 
... 

这是在SQL Server优化。 COALESCE不是。

编辑:这不一样的保罗·威廉斯的答案,但他的回答让明确的‘NULL = NULL’相匹配。 mlogic更简单,因为NULL永远不会等于NULL。

+0

我相信这是你应该比较为NOT NULL的变量的列(R.MitigationOwner)。 “然后用NULL MitigationOwner或ModifiedDate记录不会显示”通过@ user1181942 – 2012-04-05 12:27:09

+0

@EuclidesMulémbwè:当@MitigationOwner是NULL发生的问题。然后你有'NULL = COALESCE(NULL,NULL)'这是unknown = false。所以,当@MitigationOwner为null时,你不会针对R.MitigationOwner进行编译。当NOT NULL时,你这样做。 – gbn 2012-04-05 12:29:33

1

如果R.MitigationOwner可以为空,那么你比较子句:

WHERE 
R.MitigationOwner = COALESCE(@MitigationOwner,R.MitigationOwner) 

必须重写,以处理空值:

WHERE 
((R.MitigationOwner IS NULL AND @MitigationOwner IS NULL) 
OR (R.MitigationOwner = @MitigationOwner)) 

this article on Wikipedia about NULL

+0

Thanks..I不能遵循这个链接,但我搜索维基百科...它真正加入到我的知识 – user1181942 2012-04-05 13:02:15

+0

谢谢。我将链接固定为指向正确的文章。 – 2012-04-10 18:54:23