Implicar bit con constante 1 o 0 en SQL Server

154

¿Es posible expresar 1 o 0 como un bit cuando se usa como valor de campo en una instrucción select?

p.ej

En este caso, la declaración (que es parte de una declaración de selección) ICourseBased es de tipo int.

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

Para que sea un poco tipo tengo que emitir ambos valores.

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

¿Existe una forma abreviada de expresar los valores como tipo de bit sin tener que emitir cada vez?

(Estoy usando MS SQL Server 2005)

Damien McGivern
fuente

Respuestas:

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

La especificación CAST es "CAST (expresión como tipo)". El CASO es una expresión en este contexto.

Si tiene múltiples expresiones de este tipo, declararía bit vars @true y @false y las usaría. O use UDF si realmente quisiera ...

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 ...
gbn
fuente
1
Una liendre, debe ser "else 0" en la línea 5.
Shannon Severance
1
Para que el código sea más legible, estandarizamos nuestro SQL y ahora usamos variables de bit declaradas cuando necesitamos expresar verdadero / falso.
Damien McGivern
@Damien McGivern: También lo encontré útil cuando tuve muchos CASTs
gbn
10

Puede agregar el segundo fragmento como una definición de campo para ICourseBased en 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
Michael Petrotta
fuente
Esto funciona, pero tiene el inconveniente de que cast () devuelve un tipo NULL.
Dan
6

No, pero podría emitir la expresión completa en lugar de los subcomponentes de esa expresión. En realidad, eso probablemente lo hace menos legible en este caso.

Gary McGill
fuente
4

Ligeramente más condensado que el de gbn:

Suponiendo CourseIdque no es cero

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

COALESCEes como un ISNULL(), pero devuelve el primer no nulo.

Un valor distinto de CourseIdcero CourseIdobtendrá una conversión de tipo a 1, mientras que un valor nulo hará que COALESCE devuelva el siguiente valor, 0

kpkpkp
fuente
4

Si desea que la columna sea BIT y NO NULL, debe poner ISNULL antes del CAST.

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

Lamentablemente no. Tendrá que emitir cada valor individualmente.

Andrew Hare
fuente
0

La expresión a usar dentro de SELECT podría ser

CAST(IIF(FC.CourseId IS NOT NULL, 1, 0) AS BIT)
IamProfChaos
fuente
Haga que esta respuesta sea más útil y explique o proporcione enlaces a la biblioteca / documentación
happymacarts
Hola y bienvenidos a SO. Por favor explique su respuesta.
Chait
Aunque IIF se ve mejor que case when ... else ... end, uno todavía tiene que lanzar 1y 0al tipo BIT.
Fabio A.
-1

Disfruta esto :) Sin emitir cada valor individualmente.

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