it-swarm.com.de

Implizite Bit mit konstanter 1 oder in SQL Server

Kann man 1 oder 0 als ein Bit ausdrü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

Damit es ein bisschen Typ ist, muss ich beide Werte umsetzen.

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

Gibt es eine kurze Methode, um die Werte als Bittyp auszudrücken, ohne jedes Mal umsetzen zu müssen?

(Ich verwende MS SQL Server 2005)

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

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

Wenn Sie mehrere solcher Ausdrücke haben, würde ich bit vars @true und @false deklarieren und 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 ...
189
gbn

Sie können den zweiten Ausschnitt 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
10

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

5
Gary McGill

Wenn Sie möchten, dass die Spalte BIT und NOT 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
3
fnascimento

Etwas mehr kondensiert als bei gbn:

Angenommen, CourseId ist nicht Null

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

COALESCE ist wie eine ISNULL(), gibt jedoch den ersten Nicht-Nullwert zurück.

Ein Nicht-Null-Wert CourseId erhält eine Typumwandlung in eine 1, während ein Nullwert CourseId den nächsten Wert 0 zurückgibt

3
kpkpkp

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

1
Andrew Hare

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

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

Der in SELECT zu verwendende Ausdruck könnte sein

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