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)

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

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

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.


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


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

1

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


0

Der in SELECT zu verwendende Ausdruck könnte sein

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.