2009-07-23 5 views
111

È possibile esprimere 1 o 0 come bit quando utilizzato come valore di campo in un'istruzione select?Bit implicito con costante 1 o 0 in SQL Server

ad es.

In questo caso, l'istruzione (che fa parte di un'istruzione select) ICourseBased è di tipo int.

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

Per ottenere un tipo di bit è necessario eseguire il cast di entrambi i valori.

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

C'è un modo breve per esprimere i valori come tipo di bit senza dover eseguire il cast ogni volta?

(sto usando MS SQL Server 2005)

risposta

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

La specifica CAST è "CAST (espressione tipo AS)". CASE è un'espressione in questo contesto.

Se si dispone di più di tali espressioni, dichiarare bit vars @true e @false e utilizzarle. Oppure utilizzare UDF se si voleva davvero ...

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

Un nit, dovrebbe essere "else 0" sulla linea 5. –

+1

Grazie. Che sciocco ... – gbn

+1

Per rendere il codice più leggibile abbiamo standardizzato il nostro SQL e ora usiamo variabili di bit dichiarate quando abbiamo bisogno di esprimere vero/falso. –

5

No, ma potresti lanciare l'intera espressione, piuttosto che i sub-componenti di tale espressione. In realtà, questo probabilmente lo rende meno leggibile in questo caso.

1

Purtroppo, no. Dovrai trasmettere ogni valore individualmente.

7

si potrebbe aggiungere il secondo frammento di come una definizione di campo per ICourseBased in una vista.

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

Questo funziona, ma ha il lato negativo che cast() restituisce un tipo NULL. – Dan

3

Leggermente maggiore sintesi GBN di:

Supponendo CourseId è diverso da zero

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

COALESCE è come un ISNULL(), ma restituisce il primo non-null.

A Non-Zero CourseId otterrà tipo pressofuso ad un 1, mentre un nulla CourseId causerà COALESCE per restituire il valore successivo, 0

2

Se si desidera che la colonna è BIT e NOT NULL, si dovrebbe mettere ISNULL prima del CAST.

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

IIF (FC.CourseId non è nullo, 1, 0)

+0

Rendi questa risposta più utile e spiega o fornisci collegamenti alla libreria/documenti – happymacarts

+0

Ciao, e benvenuto in SO. Per favore spiega la tua risposta. – Chaithanya

0

godere di questo :) senza getto di ogni valore singolarmente.

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