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)

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 ...

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

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.


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


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


0

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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.