Boolean Expressions in SQL Select list
Asked Answered
K

4

70

I want to create a SQL Select to do a unit test in MS SQL Server 2005. The basic idea is this:

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

The idea being that, if the value of the "foo" column is "Result", then I'd get a value of true/1; if it isn't, I'd get false/0.

Unfortunately, T-SQL doesn't like the expression; it chokes on the equals sign.

Is there some way of evaluating an expression in the SQL select list and getting a returnable result? (Or some other way of achieving the unit testing that I want?)


EDIT: 3 great, answers, all built around CASE. I'll accept feihtthief's as he's got the least rep and thus needs it the most. :-) Thanks to everyone.

Kathe answered 30/1, 2009 at 22:28 Comment(2)
Will never cease to amaze how ridiculous TSQL's handling of booleans is. Great question BTW.Fotina
It's like they've designed the language syntax to explicitly enforce an antipatternZebrass
N
99

Use the case construct:

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

Also see the MSDN Transact-SQL CASE documentation.

Natividad answered 30/1, 2009 at 22:30 Comment(0)
W
22
SELECT 'TestName', 
    CASE WHEN Foo = 'Result' THEN 1 ELSE 0 END AS TestResult
FROM bar 
WHERE baz = @Criteria
Wideman answered 30/1, 2009 at 22:30 Comment(1)
Returns: (No column name) | TestResult / TestName | 1Reflate
G
18

Use CASE:

SELECT 'Test Name' [col1],
  CASE foo
    WHEN 'Result' THEN 1
    ELSE 0
  END AS [col2]
FROM bar
WHERE baz = (some criteria)
Grapevine answered 30/1, 2009 at 22:33 Comment(3)
This one is slightly better because it uses the optimized equality 'case', i.e. case foo when 'Result' rather than case when foo = 'Result'Gilges
@MarkSowul: Can you provide some info on how the simple case is optimized over the searched case? I was always under the impression that a simple case gets evaluated or rewritten by the parser to a searched case, but based on this (sqlperformance.com/2014/06/t-sql-queries/…) I think there are a lot real-world cases where you might be right.Strop
I'm sorry, I don't remember at this point. I vaguely remember seeing different execution plans in some particular situation. This also would have been before SQL 2012. Ultimately though because the 'simple case' (case x when y) is more restricted the optimizer should have an easier time with itGilges
A
17

You can also use:

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

I know this was asked a while back, but I hope this helps someone out there.

Agglutinate answered 12/9, 2015 at 0:48 Comment(2)
IIF is only available from Sql Server 2012 on wards and Sql Azure as far as I know (msdn.microsoft.com/en-za/library/hh213574.aspx)Strop
Although my situation was a little bit different, the IIF option gave me the in-line answer I needed for my evaluation I was doing. Thanks!Hebdomad

© 2022 - 2024 — McMap. All rights reserved.