在CASE WHEN中'指定非布尔类型的表达式'

时间:2013-05-21 15:53:14

标签: sql-server tsql

鉴于此T-SQL代码:

SELECT CASE 
         WHEN ( Cast (CASE 
                        WHEN Isnull(bpe.new, 0) = 0 
                             AND Isnull(bpe.regular, 0) = 0 
                             AND Isnull(bpe.bargain, 0) = 0 THEN 0 
                        ELSE 1 
                      END AS BIT) 
                AND @siteID IS NULL 
                 OR bpe.siteid = @siteID ) THEN 1 
         ELSE 0 
       END AS SiteHasBrandException 
FROM   brandpromoexceptions AS bpe 

我收到错误消息:

  

在预期条件为TSQL

的上下文中指定的非布尔类型的表达式

为什么?

2 个答案:

答案 0 :(得分:1)

如果你的意思是零,那么" false"对于第一位,查询应该等同于:

SELECT CASE WHEN 
NOT ( ISNULL(bpe.new, 0) = 0 
      AND Isnull(bpe.regular, 0) = 0 
      AND Isnull(bpe.bargain, 0) = 0 )
AND ( @siteID IS NULL 
      OR bpe.siteid = @siteID )
THEN 1 
ELSE 0 
END AS SiteHasBrandException 
FROM brandpromoexceptions AS bpe 

你可能需要小心这个" OR"条款,或添加括号以澄清。我在这里猜到了。

答案 1 :(得分:0)

您正在将第一个CASE语句传递给CAST,而不是有条件的。错误消息几乎说明了它。

我不确定你要做什么,但你似乎明白你需要根据你后来使用CASE WHEN将布尔值传递给CASE所以希望这有助于

这是在黑暗中拍摄,尝试将代码更改为:

SELECT CASE 
     WHEN ( Cast (CASE 
                    WHEN Isnull(bpe.new, 0) = 0 
                         AND Isnull(bpe.regular, 0) = 0 
                         AND Isnull(bpe.bargain, 0) = 0 THEN 0 
                    ELSE 1 
                  END AS BIT) = 1
            AND @siteID IS NULL 
             OR bpe.siteid = @siteID ) THEN 1 
     ELSE 0 
   END AS SiteHasBrandException 
FROM   brandpromoexceptions AS bpe