代码之家  ›  专栏  ›  技术社区  ›  Mike Keller

在需要条件的上下文中指定的非布尔类型的表达式,靠近'end'

  •  4
  • Mike Keller  · 技术社区  · 16 年前

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

    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小马和Mark Byers基本上都是一样的,只是错过了最后一段。再次感谢。

    3 回复  |  直到 12 年前
        1
  •  6
  •   egrunin    16 年前

    我很肯定其他的答案会漏掉一个案例:

    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?
    )
    
        2
  •  2
  •   Mark Byers    16 年前

    您正在从事例表达式返回字符串,但只能使用布尔值。未计算字符串。您可以使用动态SQL执行您想要的操作,也可以这样编写它:

    AND (
        (@param1 = 0 AND Table.Field IS NULL) OR
        (@param1 = 1 AND Table.Field IS NOT NULL)
    )
    
        3
  •  2
  •   OMG Ponies    16 年前
    1. 在WHERE子句中不能像尝试的那样使用CASE
    2. 仅当使用动态SQL时,在案例中提供的文本才会运行。

    用途:

    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语句和单独的查询以及正确的where子句。

    推荐文章