【问题标题】:An expression of non-boolean type specified in a context where a condition is expected, near 'END'在预期条件的上下文中指定的非布尔类型的表达式,靠近“END”
【发布时间】:2010-06-10 21:11:01
【问题描述】:

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

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 几乎是一样的,只是缺少最后一块。再次感谢。

【问题讨论】:

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


    【解决方案1】:

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

    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?
    )
    

    【讨论】:

    • 处理@param1 的最后一行不是必需的,因为它不会影响结果集。但明确表达并没有什么坏处。
    • @OMG Ponies:如果没有最后一次测试,@param1 = 2 不会总是返回 0 条记录吗?
    • 不,因为括号和 AND 关键字
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      1. 您不能像尝试的那样在 WHERE 子句中使用 CASE
      2. 您在 CASE 中提供的文本只有在您使用动态 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,或者如果只有一个参数 - 使用带有单独查询和正确 WHERE 子句的 IF/ELSE 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-22
        相关资源
        最近更新 更多