2009-07-23 10 views
111

Czy można wyrazić 1 lub 0 jako bit, gdy jest używana jako wartość pola w instrukcji select?Imply bit ze stałą 1 lub 0 w SQL Server

np.

W tym przypadku instrukcja (która jest częścią instrukcji select) ICourseBased jest typu int.

case 
when FC.CourseId is not null then 1 
else 0 
end 
as IsCoursedBased 

Aby uzyskać nieco inny typ, muszę rzucić obie wartości.

case 
when FC.CourseId is not null then cast(1 as bit) 
else cast(0 as bit) 
end 
as IsCoursedBased 

Czy istnieje krótka metoda wyrażania wartości jako typu bitowego bez rzucania za każdym razem?

(używam MS SQL Server 2005)

Odpowiedz

156
cast (
    case 
    when FC.CourseId is not null then 1 else 0 
    end 
as bit) 

Specyfikacja CAST to "CAST (wyrażenie typu AS)". CASE jest w tym kontekście wyrażeniem .

Jeśli masz wiele takich wyrażeń, zadeklaruję bit vars @true i @false i użyję ich. Lub użyj funkcji UDF, jeśli naprawdę chcesz ...

DECLARE @True bit, @False bit; 
SELECT @True = 1, @False = 0; --can be combined with declare in SQL 2008 

SELECT 
    case when FC.CourseId is not null then @True ELSE @False END AS ... 
+1

Nitka powinna być "jeszcze 0" na linii 5. –

+1

Dzięki. Jak głupio ... – gbn

+1

Aby kod był bardziej czytelny, ustandaryzowaliśmy nasz SQL i teraz używamy zadeklarowanych zmiennych bitowych, kiedy musimy wyrazić wartość true/false. –

5

Nie, ale można rzucić cały wyraz zamiast cząstkowych składników tego wyrażenia. Faktycznie, to prawdopodobnie sprawia, że ​​w tym przypadku jest on czytelny.

1

Niestety, nie. Będziesz musiał rzucić każdą wartość indywidualnie.

7

Możesz dodać drugi fragment jako definicję pola dla obiektu ICourseBased w widoku.

DECLARE VIEW MyView 
AS 
    SELECT 
    case 
    when FC.CourseId is not null then cast(1 as bit) 
    else cast(0 as bit) 
    end 
    as IsCoursedBased 
    ... 

SELECT ICourseBased FROM MyView 
+0

Działa to, ale ma wadę, że cast() zwraca typ NULL. – Dan

3

Nieco bardziej skondensowany niż gbn-tych:

Zakładając CourseId jest niezerowe

CAST (COALESCE(FC.CourseId, 0) AS Bit) 

COALESCE jest jak ISNULL(), ale zwraca pierwszy niezerowe.

niezerową CourseId dostanie typu obsady na 1, natomiast wartość null CourseId spowoduje COALESCE wrócić następną wartość, 0

2

Jeśli chcesz kolumna jest bit i NOT NULL, należy umieścić ISNULL przed CAST.

ISNULL(
    CAST (
     CASE 
     WHEN FC.CourseId IS NOT NULL THEN 1 ELSE 0 
     END 
    AS BIT) 
,0) AS IsCoursedBased 
0

IIF (FC.CourseId IS NOT NULL, 1, 0)

+0

Uczyń tę odpowiedź bardziej użyteczną i wyjaśnij lub podaj linki do biblioteki/dokumentów – happymacarts

+0

Witam i zapraszam do SO. Proszę wyjaśnij swoją odpowiedź. – Chaithanya

0

Lubisz ten :) Bez obsady każda wartość indywidualnie.

SELECT ..., 
    IsCoursedBased = CAST(
     CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END 
    AS BIT 
) 
FROM fc