2009-01-30 3 views
40

Я хочу, чтобы создать SQL-запрос, чтобы сделать модульное тестирование в MS SQL Server 2005. Основная идея заключается в следующем:булевы выражения в SQL Select списка

выберите 'Test Name', Foo = 'Result' из bar где baz = (некоторые критерии)

Идея состоит в том, что если значение столбца «foo» равно «Result», тогда я получаю значение true/1; если это не так, я получаю false/0.

К сожалению, T-SQL не нравится выражение; он зажимает знак равенства.

Есть ли способ оценить выражение в списке выбора SQL и получить возвращаемый результат? (? Или какой-то другой способ достижения модульного тестирования, что я хочу)


EDIT: 3 большие, ответы, все построено вокруг CASE. Я соглашусь с feihtthief, так как у него наименьшая репутация, и поэтому он больше всего нужен. :-) Спасибо всем.

+1

Никогда не перестанет удивлять, насколько смешная обработка TSQL булевых. Большой вопрос BTW. – hajikelist

ответ

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

использования:

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

Это немного лучше, потому что он использует оптимизированный случай равенства, то есть 'case foo, когда« Результат », а не« случай, когда foo = «Результат» –

+0

@MarkSowul: Можете ли вы предоставить некоторую информацию о том, как простой случай оптимизирована по искаемому случаю? Мне всегда казалось, что простой случай оценивается или переписывается синтаксическим анализатором в найденном случае, но на основании этого (http://sqlperformance.com/2014/06/t-sql-queries/dirty-secrets-of - случай-выражение) Я думаю, что есть много реальных случаев, когда вы можете быть правы. –

+0

Прошу прощения, я не помню в этот момент. Я смутно помню, как в какой-то конкретной ситуации встречались разные планы исполнения. Это также было бы до SQL 2012. В конечном счете, хотя из-за того, что «простой случай» (случай x, когда y) более ограничен, оптимизатор должен иметь более легкое время с ним. –

5

Вы также можете использовать:

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

Я знаю, что это было предложено некоторое время назад, но я надеюсь, что это помогает кто-то там.

+1

IIF доступен только на Sql Server 2012 в палатах и ​​Sql Azure as насколько я знаю (https://msdn.microsoft.com/en-za/library/hh213574.aspx) –

Смежные вопросы