【问题标题】:Boolean Expressions in SQL Select listSQL 选择列表中的布尔表达式
【发布时间】:2009-01-30 22:28:26
【问题描述】:

我想创建一个 SQL Select 来在 MS SQL Server 2005 中进行单元测试。基本思路是这样的:

select 'Test Name', foo = 'Result'
from bar
where baz = (some criteria)

这个想法是,如果“foo”列的值是“Result”,那么我会得到一个值 true/1;如果不是,我会得到 false/0。

不幸的是,T-SQL 不喜欢这个表达式;它在等号上窒息。

是否有某种方法可以评估 SQL 选择列表中的表达式并获得可返回的结果? (或者其他实现我想要的单元测试的方法?)


编辑:3 个很好的答案,都是围绕 CASE 构建的。我会接受 feihtthief 的,因为他的代表最少,因此最需要它。 :-) 谢谢大家。

【问题讨论】:

  • TSQL 对布尔值的处理是多么荒谬,他永远不会停止惊奇。顺便说一句,好问题。

标签: sql unit-testing tsql expression assert


【解决方案1】:

使用案例构造:

select 'Test Name', 
    case when foo = 'Result' then 1 else 0 end 
    from bar where baz = (some criteria)

另见the MSDN Transact-SQL CASE documentation

【讨论】:

    【解决方案2】:
    SELECT 'TestName', 
        CASE WHEN Foo = 'Result' THEN 1 ELSE 0 END AS TestResult
    FROM bar 
    WHERE baz = @Criteria
    

    【讨论】:

    • 返回:(无列名)|测试结果/测试名称 | 1
    【解决方案3】:

    用例:

    SELECT 'Test Name' [col1],
      CASE foo
        WHEN 'Result' THEN 1
        ELSE 0
      END AS [col2]
    FROM bar
    WHERE baz = (some criteria)
    

    【讨论】:

    • 这个稍微好一点,因为它使用了优化的相等'case',即case foo when 'Result'而不是case when foo = 'Result'
    • @MarkSowul:您能否提供一些关于简单案例如何在搜索案例上进行优化的信息?我一直认为一个简单的案例会被解析器评估或重写为搜索的案例,但基于此 (sqlperformance.com/2014/06/t-sql-queries/…) 我认为有很多真实案例你可能是对的。
    • 对不起,我现在不记得了。我隐约记得在某些特定情况下看到不同的执行计划。这也应该是在 SQL 2012 之前。最终,因为“简单案例”(当 y 时的案例 x)受到更多限制,优化器应该更容易使用它
    【解决方案4】:

    你也可以使用:

    select 
        'Test Name', 
        iif(foo = 'Result', 1, 0)
    from bar 
    where baz = (some criteria)
    

    我知道这是不久前被问到的,但我希望这对那里的人有所帮助。

    【讨论】:

    • 据我所知,IIF 仅适用于 Sql Server 2012 on wards 和 Sql Azure (msdn.microsoft.com/en-za/library/hh213574.aspx)
    • 虽然我的情况有点不同,但 IIF 选项为我提供了我正在进行的评估所需的在线答案。谢谢!
    猜你喜欢
    • 2015-04-29
    • 2015-01-21
    • 2012-03-25
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 2023-03-23
    相关资源
    最近更新 更多