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)

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 ...

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

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.


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


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


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)

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.