2009-07-23 9 views
111

Ist es möglich, 1 oder 0 als ein Bit auszudrücken, wenn es als Feldwert in einer Select-Anweisung verwendet wird?Imply-Bit mit Konstante 1 oder 0 in SQL Server

z.B.

In dieser Case-Anweisung (die Teil einer Select-Anweisung ist) ist ICourseBased vom Typ int.

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

Um es ein bisschen Typ zu bekommen, muss ich beide Werte werfen.

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

Gibt es einen kurzen Weg, die Werte als Bit-Typ auszudrücken, ohne jedes Mal neu zu schreiben?

(Ich bin mit MS SQL Server 2005)

Antwort

156
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 solche Ausdrücke haben, würde ich Bit Vars @true und @false deklarieren und sie verwenden. Oder nutzen Sie UDF, wenn Sie wirklich willst ...

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

Ein nit, sollte "sonst 0" in Zeile 5 sein. –

+1

Danke. Wie dumm ... – gbn

+1

Um den Code lesbarer zu machen, haben wir unser SQL standardisiert und verwenden nun deklarierte Bitvariablen, wenn wir True/False ausdrücken müssen. –

5

Nein, aber man kann den gesamten Ausdruck, anstatt die Unterkomponenten dieses Ausdrucks gegossen. Eigentlich macht es das wahrscheinlich weniger in diesem Fall lesbar.

1

Leider nein. Sie müssen jeden Wert einzeln umwandeln.

7

Sie könnten den zweiten Schnipsel als Felddefinition für ICourseBased in einer Ansicht hinzuzufü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 
+0

Das funktioniert, hat aber den Nachteil, dass cast() einen NULL-Typ zurückgibt. – Dan

3

Etwas mehr als GBN kondensiert ist:

Angenommen CourseId nicht Null

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

COALESCE ist wie ein ISNULL(), sondern gibt die erste Nicht-Null.

A Non-Zero CourseId wird Typ-Umwandlung in ein 1 erhalten, während ein Null CourseId wird COALESCE veranlassen, den nächsten Wert zurückzukehren, 0

2

Wenn die verschobene Spalte BIT ist und NOT NULL, sollten Sie setzen ISNULL vor dem CAST.

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

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

+0

Machen Sie diese Antwort nützlicher und erklären oder stellen Sie Links zur Bibliothek/Dokumentation bereit. – happymacarts

+0

Hallo, und willkommen bei SO. Bitte erläutern Sie Ihre Antwort. – Chaithanya

0

dieses Enjoy :) Ohne Guss jeweils einzeln Wert.

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