2012-03-27 37 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))