SQL选择列表中的布尔表达式

70

我想创建一个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的答案,因为他的声望最低,因此最需要它。:-)感谢大家。


8
TSQL对布尔值的处理方式总是令人惊讶地荒谬。顺便说一句,这个问题很好。 - hajikelist
就好像他们设计语言语法是为了明确强制执行反模式一样。 - Nathan Chappell
4个回答

99

使用 case 结构:

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

还可以查看MSDN Transact-SQL CASE文档


22
SELECT 'TestName', 
    CASE WHEN Foo = 'Result' THEN 1 ELSE 0 END AS TestResult
FROM bar 
WHERE baz = @Criteria

返回:(无列名) | 测试结果/测试名称 | 1 - ono2012

18

应用场景:

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

1
这个更好一些,因为它使用了优化过的等式 "case",即 case foo when 'Result' 而不是 case when foo = 'Result' - Mark Sowul
@MarkSowul:你能提供一些有关简单情况如何优化搜索情况的信息吗?我一直以为简单情况会被解析器评估或重写为搜索情况,但根据这篇文章(http://sqlperformance.com/2014/06/t-sql-queries/dirty-secrets-of-the-case-expression),我认为在很多实际情况下你可能是正确的。 - My Other Me
对不起,我现在不记得了。我模糊地记得在某些特定情况下看到过不同的执行计划。这也可能是在 SQL 2012 之前。但最终因为“简单情况”(case x when y)更受限制,优化器应该更容易处理它。 - Mark Sowul

17

你还可以使用:

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

我知道这个问题已经问了一段时间,但我希望这可以对某个人有所帮助。


1
据我所知,IIF仅在Sql Server 2012及其以上版本以及Sql Azure中可用。(https://msdn.microsoft.com/en-za/library/hh213574.aspx) - My Other Me
虽然我的情况有点不同,但IIF选项为我正在进行的评估提供了我所需的内联答案。谢谢! - MeanJerry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接