Implica bit con costante 1 o 0 in SQL Server


154

È possibile esprimere 1 o 0 come bit se utilizzato come valore di campo in un'istruzione select?

per esempio

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 renderlo un po 'di tipo devo lanciare entrambi i valori.

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

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

(Sto usando MS SQL Server 2005)

Risposte:


226
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 hai più espressioni del genere, dichiarerei bit vars @true e @false e le userei. O usa UDF se davvero volessi ...

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
A nit, dovrebbe essere "else 0" sulla riga 5.
Shannon Severance

1
Per rendere il codice più leggibile abbiamo standardizzato il nostro SQL e ora utilizziamo le variabili di bit dichiarate quando dobbiamo esprimere vero / falso.
Damien McGivern,

@Damien McGivern: l'ho trovato utile anche quando avevo molti CAST
gbn

10

È possibile aggiungere il secondo frammento come 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

Funziona, ma ha il rovescio della medaglia che cast () restituisce un tipo NULL.
Dan

6

No, ma potresti lanciare l'intera espressione anziché i sottocomponenti di quell'espressione. In realtà, ciò probabilmente lo rende meno leggibile in questo caso.


4

Leggermente più condensato di quello di gbn:

Supponendo che CourseIdsia diverso da zero

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

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

Un Non-Zero CourseIdriceverà il cast di tipo su 1, mentre un null CourseIdfarà sì che COALESCE restituisca il valore successivo, 0


4

Se vuoi che la colonna sia BIT e NOT NULL, dovresti 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

L'espressione da usare all'interno di SELECT potrebbe essere

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

Rendi questa risposta più utile e spiega o fornisci link a librerie / documenti
happymacarts

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

Sebbene IIF abbia un aspetto migliore di case when ... else ... end, si deve ancora lanciare il cast 1e 0il tipo BIT.
Fabio A.

-1

Goditi questo :) Senza trasmettere ogni valore singolarmente.

SELECT ...,
  IsCoursedBased = CAST(
      CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
    AS BIT
  )
FROM fc
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.