Bit mit Konstante 1 oder 0 in SQL Server implizieren

154

Ist es möglich, 1 oder 0 als Bit auszudrücken, wenn es als Feldwert in einer select-Anweisung verwendet wird?

z.B

In diesem Fall ist die Anweisung (die Teil einer select-Anweisung ist) ICourseBased vom Typ int.

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

Um es zu einem Bit-Typ zu machen, muss ich beide Werte umwandeln.

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

Gibt es eine kurze Möglichkeit, die Werte als Bittyp auszudrücken, ohne jedes Mal umwandeln zu müssen?

(Ich verwende MS SQL Server 2005)

Damien McGivern
quelle

Antworten:

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

Die CAST-Spezifikation lautet "CAST (Ausdruck AS-Typ)". Der CASE ist in diesem Zusammenhang ein Ausdruck .

Wenn Sie mehrere solcher Ausdrücke haben, würde ich die Bitvariablen @true und @false deklarieren und sie verwenden. Oder verwenden Sie UDFs, wenn Sie wirklich wollten ...

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
quelle
1
Eine Nite sollte "else 0" in Zeile 5 sein.
Shannon Severance
1
Um den Code besser lesbar zu machen, haben wir unser SQL standardisiert und verwenden jetzt deklarierte Bitvariablen, wenn wir true / false ausdrücken müssen.
Damien McGivern
@ Damien McGivern: Ich fand es auch nützlich, als ich viele CASTs hatte
gbn
10

Sie können das zweite Snippet als Felddefinition für ICourseBased in einer Ansicht hinzufügen.

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
quelle
Dies funktioniert, hat aber den Nachteil, dass cast () einen NULL-Typ zurückgibt.
Dan
6

Nein, aber Sie können den gesamten Ausdruck und nicht die Unterkomponenten dieses Ausdrucks umwandeln. Das macht es in diesem Fall wahrscheinlich weniger lesbar.

Gary McGill
quelle
4

Etwas kondensierter als die von gbn:

Angenommen, CourseIdist nicht Null

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

COALESCEist wie ein ISNULL(), gibt aber die erste Nicht-Null zurück.

Eine Nicht-Null CourseIdwird vom Typ in eine 1 umgewandelt, während eine Null CourseIdbewirkt, dass COALESCE den nächsten Wert 0 zurückgibt

kpkpkp
quelle
4

Wenn Sie möchten, dass die Spalte BIT und NICHT NULL ist, sollten Sie ISNULL vor CAST setzen.

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

Unglücklicherweise nicht. Sie müssen jeden Wert einzeln umwandeln.

Andrew Hare
quelle
0

Der in SELECT zu verwendende Ausdruck könnte sein

CAST(IIF(FC.CourseId IS NOT NULL, 1, 0) AS BIT)
IamProfChaos
quelle
Machen Sie diese Antwort nützlicher und erklären Sie oder stellen Sie Links zu Bibliothek / Dokumenten
bereit
Hallo und willkommen bei SO. Bitte erläutern Sie Ihre Antwort.
Chait
Obwohl IIF als besser aussieht case when ... else ... end, hat man noch zu gegossenen 1und 0mit dem BIT - Typ.
Fabio A.
-1

Genießen Sie dies :) Ohne jeden Wert einzeln zu besetzen.

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