2012-05-22 52 views
0

需要一些SQL的一些小帮助。我正在使用一个VARCHAR值来确定在WHERE子句中使用哪种逻辑的情况,但我在写这个case语句时遇到了一些问题。T-SQL where子句case语句

where 
    (CASE WHEN @p_flag = 'ATA' 
      THEN (@p_start_ata IS NULL AND @p_end_ata IS NULL) OR (vso.poa_ata between @p_start_ata and @p_end_ata) 
     ELSE (@p_start_atd IS NULL AND @p_end_atd IS NULL) OR (vso.pol_atd between @p_start_atd and @p_end_atd) 
) 

线93的附近关键字的语法不正确 '是'。

它可能是一个小错误,但它让我很沮丧。也许有更好的方式来写这个?谢谢!

+1

CASE语句只能提供**值** - 不是整个代码块。你需要重新安排你的逻辑 –

回答

2

就像之前说过的,你不能像使用case语句那样使用case语句。所以这可能是一个建议:

WHERE 
    (
     @p_flag = 'ATA' 
     AND 
      (
       (@p_start_ata IS NULL AND @p_end_ata) 
       OR (vso.poa_ata between @p_start_ata and @p_end_ata) 
      ) 
    ) 
    OR 
    (
     NOT @p_flag = 'ATA' 
     AND 
      (
       (@p_start_atd IS NULL AND @p_end_atd IS NULL) 
       OR (vso.pol_atd between @p_start_atd and @p_end_atd) 
      ) 
    ) 
+0

谢谢我最终使用这个。我正在寻找一个布尔条件,它会执行一个或另一个SQL块,但不知道如何去写在where子句中。这有帮助。 –

+0

@nickgowdy:没问题。很高兴帮助:P – Arion

0

你不能使用那样的CASE

这是用来获取值而不是限制。 Check this查看如何正确使用CASE


你的情况,你已经改变你的逻辑可能使用IF的和做的要SELECT的。