在预期条件的上下文中指定的非布尔类型的表达式,在'END'附近

时间:2010-06-10 21:11:02

标签: sql sql-server sql-server-2005

所以也许有人可以指出我导致这个错误的正确方向?我已经和它斗争了几个小时并在网上搜索,我无法弄清楚我在这里做错了什么。它作为存储过程的一部分包含在内,我不知道是否重要,如果确实如此,我也可以包含它。表和字段名称已更改,以保护无辜...意味着我的工作。感谢。

SELECT
              /* The fields are here*/
FROM
              /* my joins are here */
WHERE
    (Table.Field = stuff)
    AND
    (Table.Field2 = otherstuff)
    AND
    (Table2.Field3 = someotherstuff)
    AND
    CASE @param1
        WHEN 0 THEN 'Table.Field IS NULL'
        WHEN 1 THEN 'Table.Field2 IS NOT NULL'
        ELSE ''
    END

感谢您的回复。从技术上讲,egrunin是这个问题的正确答案,但OMG Ponies和Mark Byers几乎完全相同,只是错过了最后一件。再次感谢。

3 个答案:

答案 0 :(得分:6)

我很确定其他答案会遗漏一个案例:

WHERE 
(Table.Field = stuff)
AND
(Table.Field2 = otherstuff)
AND
(Table2.Field3 = someotherstuff)
AND
(
    (@param1 = 0 and Table.Field IS NULL)
    OR
    (@param1 = 1 and NOT Table.Field2 IS NULL)
    OR
    (@param1 <> 0 AND @param1 <> 1) -- isn't this needed?
)

答案 1 :(得分:2)

您正在从case表达式返回一个字符串,但只能使用布尔值。不评估字符串。你可以使用动态SQL做你想做的事情,或者你可以这样写它:

AND (
    (@param1 = 0 AND Table.Field IS NULL) OR
    (@param1 = 1 AND Table.Field IS NOT NULL)
)

答案 2 :(得分:2)

  1. 您不能像在尝试
  2. 那样在WHERE子句中使用CASE
  3. CASE中提供的文本只有在使用动态SQL
  4. 时才会运行

    使用:

    WHERE Table.Field = stuff
      AND Table.Field2 = otherstuff
      AND Table2.Field3 = someotherstuff
      AND (   (@param1 = 0 AND table.field IS NULL)
           OR (@param1 = 1 AND table.field2 IS NOT NULL))
    

    ...如果您已经拥有Table.Field = stuff等等,这没有意义......

    表现更好的选项是使整个查询成为动态SQL,或者如果只有一个参数 - 使用带有单独查询的IF / ELSE语句&amp;正确的WHERE子句。