2012-07-17 70 views
1

我正在做一個rdl報告,我有三個複選框,如果選中需要改變我的WHERE語句。如果沒有選中,結果只能按日期範圍匹配。如果選中一個或多個,則需要返回與變量相對應的字符串匹配的字段。SQL布爾值在哪裏站

WHERE 
(EffectiveDate BETWEEN @StartDate AND @EndDate) 
AND (((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR @IncludeSEWPrefix = 0) 
AND ((@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR @IncludePAWPrefix = 0) 
AND ((@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR @IncludeRPLPrefix = 0)) 

我的代碼時沒有進行檢查,當一個被選中至今的作品,但是當一個以上的複選框已檢查返回任何內容。所以要嘗試修復此問題,我將代碼更改爲此

WHERE 
(EffectiveDate BETWEEN @StartDate AND @EndDate) 
AND ((((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR @IncludeSEWPrefix = 0) 
OR ((@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR @IncludePAWPrefix = 0) 
OR ((@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR @IncludeRPLPrefix = 0))) 

無論選擇什麼內容,都會導致返回所有行。有人能告訴我我要去哪裏嗎?

回答

1

我相信這是正確的重排。 Trickier問題比它第一次出現。這個問題是分開的行像((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR @IncludeSEWPrefix = 0)AND意味着如果兩個包含是真實的,行將需要有兩個PrefixId的,這是不可能發生的。如果你將它們與OR分開,那麼只有一個包含false,意味着每一行都會通過。相反,請檢查一行是否包含任何包含的前綴,否則所有內容都必須關閉。

WHERE EffectiveDate BETWEEN @StartDate AND @EndDate 
AND 
(
    (@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR 
    (@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR 
    (@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR 
    (@IncludeSEWPrefix = 0 AND @IncludePAWPrefix = 0 AND @IncludeRPLPrefix = 0) 
) 
+0

謝謝你的解決方案工作完美,你的解釋非常明確 – 2012-07-17 13:11:36

0

試試這個

WHERE 
(EffectiveDate BETWEEN @StartDate AND @EndDate) 
AND 
(
(@IncludeSEWPrefix = 1 AND PrefixId = 'SEW' OR @IncludeSEWPrefix = 0) AND 
(@IncludePAWPrefix = 1 AND PrefixId = 'PAW' OR @IncludePAWPrefix = 0) AND 
(@IncludeRPLPrefix = 1 AND PrefixId = 'RPL' OR @IncludeRPLPrefix = 0) 
) 
+0

感謝您的回覆,但它沒有奏效。我的東西你的代碼和我的第一個解決方案是一樣的,但用逗號較少。 – 2012-07-17 10:32:39

0

你比需要更多的括號,它並沒有大礙,但只是知道。 也許這可以幫助:

WHERE (EffectiveDate BETWEEN @StartDate AND @EndDate) 
    AND ( ((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR (@IncludeSEWPrefix = 0 AND @PrefixId <> 'SEW')) 
     OR ((@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR (@IncludePAWPrefix = 0 AND @PrefixId <> 'PAW')) 
     OR ((@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR (@IncludeRPLPrefix = 0 AND @PrefixId <> 'RPL')) 
     ) 
+0

感謝您的回覆,但此代碼與第一個示例產生的結果相同。如果兩個變量是真的,它需要返回匹配字符串的行 – 2012-07-17 10:45:39

+0

現在再試一次... – Yaroslav 2012-07-17 10:50:17

+0

沒有抱歉,這和我的第二個例子一樣。它將返回所有行,而不管已檢查的內容。 – 2012-07-17 10:55:55