2009-01-30 17 views
40

Chcę utworzyć SQL Select to zrobić testów jednostkowych w MS SQL Server 2005. Podstawowa idea jest taka:logiczne Wyrażenia w SQL liście Wybierz

wybierz 'Nazwa testu' foo = 'Wynik' od pasek gdzie baz = (niektóre kryteria)

Pomysł polega na tym, że jeśli wartość kolumny "foo" to "Wynik", to otrzymam wartość true/1; jeśli nie, otrzymam fałsz/0.

Niestety, T-SQL nie lubi wyrażenia; dławi się na znaku równości.

Czy istnieje sposób oceny wyrażenia na liście wyboru SQL i uzyskania wyniku zwrotnego? (Lub inny sposób osiągnięcia testu jednostkowego, który chcę?)


EDYCJA: 3 wielkie, odpowiedzi, wszystkie zbudowane wokół CASE. Przyjmę feihtthiefa, ponieważ ma najmniejszy przedstawiciel i dlatego potrzebuje go najbardziej. :-) Dziękuję wszystkim.

+1

Nigdy nie przestaniesz zadziwiać, jak absurdalna jest obsługa bajtanów przez TSQL. Świetne pytanie BTW. – hajikelist

Odpowiedz

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

przypadek użycia:

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

Ten jest nieco lepszy, ponieważ używa zoptymalizowanej równości "case", czyli 'case foo when 'Result'' zamiast' case when foo =' Result'' –

+0

@MarkSowul: Czy możesz podać trochę informacji o tym, jak prosty przypadek jest zoptymalizowany względem szukanej sprawy? Zawsze miałem wrażenie, że prosty przypadek zostanie oceniony lub przepisany przez parser do przeszukiwanej sprawy, ale na podstawie tego (http://sqlperformance.com/2014/06/t-sql-queries/dirty-secrets-of -the-case-expression) Wydaje mi się, że jest wiele rzeczywistych przypadków, w których możesz mieć rację. –

+0

Przykro mi, nie pamiętam w tym momencie. Niejasno pamiętam, widząc różne plany wykonania w konkretnej sytuacji. To również byłoby przed SQL 2012. Ostatecznie jednak, ponieważ "prosty przypadek" (przypadek x kiedy y) jest bardziej ograniczony, optymalizator powinien mieć łatwiejszy czas z nim –

5

Można również użyć:

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

Znam ten został poproszony jakiś czas temu, ale mam nadzieję, że to pomoże kogoś tam.

+1

IIF jest dostępny tylko z Sql Server 2012 na oddziałach i Sql Azure jako o ile wiem (https://msdn.microsoft.com/en-za/library/hh213574.aspx) –