2009-07-23 21 views
111

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

p. Ej.

En esta sentencia de caso (que es parte de una instrucción select) ICourseBased es de tipo int.

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

Para que sea un tipo de bit, 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 

¿Hay una manera breve de expresar los valores como tipo de bit sin tener que emitir cada vez?

(estoy usando MS SQL Server 2005)

Respuesta

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

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

Si tiene varias de estas expresiones, declararía bit vars @true y @false y las usaría. O utilizar las UDF si realmente quería ...

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 nit, debería ser "else 0" en la línea 5. –

+1

Thanks. Qué tonto ... – gbn

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

5

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

1

Lamentablemente, no. Tendrás que lanzar cada valor individualmente.

7

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 
+0

Esto funciona, pero tiene la desventaja de que cast() devuelve un tipo NULL. – Dan

3

Ligeramente más condensada que la de GBN:

Suponiendo CourseId no es cero

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

COALESCE es como un ISNULL(), pero devuelve la primera no nulo.

distinto de cero CourseId recibirá tipo de fundición a un 1, mientras que un nulo CourseId hará que se unen para devolver el siguiente valor, 0

2

Si desea que la columna es BIT y NOT NULL, se debería 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

IIF (FC.CourseId no es nulo, 1, 0)

+0

Haga que esta respuesta sea más útil y explique o proporcione enlaces a la biblioteca/documentos – happymacarts

+0

Hola, y bienvenido a SO. Por favor explica tu respuesta. – Chaithanya

0

Disfrute de este :) sin el molde cada valor individual.

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