2012-03-27 55 views
2

我可以使用標誌來選擇不同的WHERE子句嗎?像這樣的東西。基於標誌的Where子句中的條件

SELECT fields 
from T3 t3 
left outer join T1 t1 on T1.Id=t2.Id 
WHERE 
    CASE 
     WHEN @Status <> 1 
     THEN (t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1) 
     ELSE t2.Id = @SID AND t2.StatusID = 12 
GROUP BY whatever 
+0

您正在從T3中選擇並加入T1,其中T1 = T2但您沒有加入T2的任何地方?你缺少代碼嗎? – Taryn 2012-03-27 21:50:27

+0

是啊!對錯字感到抱歉。我正在做同樣的事情,但得到一個分析錯誤。 '='附近語法不正確。在WHERE語句中。 – user424134 2012-03-27 21:59:24

+0

你在查詢中加入T2嗎?如果是的話,你可以編輯問題併發布完整的查詢? – Taryn 2012-03-27 22:02:11

回答

0

首選方式:

WHERE 
    (@Status <> 1 AND t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1) 
    OR (t2.Id = @SID AND t2.StatusID = 12) 

或者這是一個小更易於閱讀case語句:

WHERE 
CASE WHEN @Status <> 1 
     AND t3.Id = @SId 
     AND sh.StatusId = 3 
     AND k.StatusId = 1 THEN 1 
WHEN t2.Id = @SID 
     AND t2.StatusID = 12 THEN 1 
ELSE 0 END = 1 
+0

謝謝!有很多東西要向你們學習.. – user424134 2012-03-27 22:03:48

+0

@ user424134:我不認爲這些WHERE條款遵循問題中的邏輯,並且都導致「誤報」錯誤。看到我的答案。 – onedaywhen 2012-03-28 09:27:25

+0

@onedaywhen我同意我的答案不符合他的原始內容,但他正在與原來的掙扎,我認爲這可能是他想要的邏輯。如果沒有,更清楚地寫下來將有助於他使用正確的邏輯。 – JBrooks 2012-03-28 14:24:22

2

爲什麼你需要CASE當?你可以做WHERE狀態<> 1 AND ... OR ...?

1

您可以 - 只需將END添加到CASE即可。

SELECT fields 
FROM T3 t3 
LEFT OUTER JOIN T1 t1 on T1.Id=t2.Id 
WHERE 
     CASE 
      WHEN @Status <> 1 THEN 
      (t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1) 
      ELSE 
      t2.Id = @SID AND t2.StatusID = 12 
     END 
GROUP BY whatever 
+0

它與劑量一起工作。在WHERE語句中得到解析器錯誤。 '='附近的語法不正確 – user424134 2012-03-27 21:56:56

+0

查詢未完成 - 別名「t2」無法解析。我只是複製你的代碼並添加'END'來解釋必要的語法變化。 – Ryan 2012-03-27 22:02:15

1

當然可以。 CASE返回一個值,所以使用會是這樣的:

where case 
    when @Mode = 1 and A.Foo = B.Foo then 1 
    when @Mode = 2 and A.Foo > B.Foo + 5 then 1 
    when A.Bar < @Mode then 1 
    else 0 
    end = 1 
1

我不不要認爲@ JBrooks已經正確地翻譯了你的病例陳述(並且令人擔憂的是,可能導致誤報)。

我覺得CASE相當於如下:

WHERE 1 = CASE 
      WHEN @Status <> 1 
      THEN CASE 
        WHEN (t3.Id = @SID AND sh.StatusId = 3 AND k.StatusId = 1) 
        THEN 1 
        END 
      ELSE CASE 
        WHEN t2.Id = @SID AND t2.StatusID = 12 
        THEN 1 
        END 
      END 

我這樣做,不過,一致認爲這樣的結構是難以閱讀和調試,並同意它可轉化。然而,儘管@ JBrooks的「優選方式」是分離正態形式(即需要parens的(predicate_1 OR predicate_2)),但我更喜歡連接正常形式(即preidcate_1 AND preidcate_2),例如,

WHERE 
(p.Status = 1 OR (t3.Id = p.SID AND sh.StatusId = 3 AND k.StatusId = 1)) 
AND 
(p.Status <> 1 OR (t2.Id = p.SID AND t2.StatusID = 12))