2012-04-05 37 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