Implikuj bit ze stałą 1 lub 0 w SQL Server

154

Czy można wyrazić 1 lub 0 jako bit, gdy jest używany jako wartość pola w instrukcji select?

na przykład

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 był bitowy, muszę rzutować 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ótki sposób wyrażania wartości jako typu bitowego bez konieczności rzutowania za każdym razem?

(Używam MS SQL Server 2005)

Damien McGivern
źródło

Odpowiedzi:

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

Specyfikacją CAST jest „CAST (wyrażenie AS typ)”. CASE jest wyrażeniem w tym kontekście.

Jeśli masz wiele takich wyrażeń, zadeklarowałbym bit vars @true i @false i użył ich. Lub użyj 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 ...
gbn
źródło
1
Nit, powinno być „else 0” w linii 5.
Shannon Severance,
1
Aby uczynić kod bardziej czytelnym, ustandaryzowaliśmy nasz SQL i teraz używamy zadeklarowanych zmiennych bitowych, gdy musimy wyrazić wartość prawda / fałsz.
Damien McGivern
@Damien McGivern: Też uznałem to za przydatne, gdy miałem wiele CAST
gbn
10

Możesz dodać drugi fragment kodu jako definicję pola dla 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
Michael Petrotta
źródło
To działa, ale ma tę wadę, że cast () zwraca typ NULL.
Dan
6

Nie, ale możesz rzucić całą ekspresję zamiast jej części składowych. Właściwie to prawdopodobnie czyni go mniej czytelnym w tym przypadku.

Gary McGill
źródło
4

Nieco bardziej skondensowane niż gbn:

Zakładając, że CourseIdjest niezerowa

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

COALESCEjest jak an ISNULL(), ale zwraca pierwszą wartość różną od Null.

Niezerową CourseIddostanie typu obsady na 1, natomiast zerowa CourseIdspowoduje COALESCE wrócić następnego wartość 0

kpkpkp
źródło
4

Jeśli chcesz, aby kolumna była BIT i NIE NULL, powinieneś umieścić ISNULL przed CAST.

ISNULL(
   CAST (
      CASE
         WHEN FC.CourseId IS NOT NULL THEN 1 ELSE 0
      END
    AS BIT)
,0) AS IsCoursedBased
Fábio Nascimento
źródło
1

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

Andrew Hare
źródło
0

Wyrażeniem, które ma być użyte wewnątrz polecenia SELECT, mogłoby być

CAST(IIF(FC.CourseId IS NOT NULL, 1, 0) AS BIT)
IamProfChaos
źródło
Uczyń tę odpowiedź bardziej użyteczną i wyjaśnij lub podaj linki do biblioteki / dokumentów
happymacarts
Witam i witam w SO. Proszę wyjaśnij swoją odpowiedź.
Chait
Chociaż IIF wygląda lepiej niż case when ... else ... end, nadal trzeba rzucać 1i 0do typu BIT.
Fabio A.
-1

Ciesz się tym :) Bez odlewania każdej wartości indywidualnie.

SELECT ...,
  IsCoursedBased = CAST(
      CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
    AS BIT
  )
FROM fc
Adrian S.
źródło