2012-04-30 15 views
84

Cómo devolver un valor booleano en SQL Select Statement?Devuelve el valor booleano en SQL Select Statement

yo probamos este código:

SELECT CAST(1 AS BIT) AS Expr1 
FROM [User] 
WHERE (UserID = 20070022) 

y sólo volver TRUE valor si el UserID existen sobre la mesa. Quiero que devuelva el valor FALSE si el UserID no existe en la tabla. Muchas gracias.

+3

¿Qué dbms? Los detalles de sql difieren. – joshp

+0

SQL Server no admite un tipo booleano, p. 'SELECCIONAR CUANDO REPARTIR (1 COMO BITS) LUEGO 'SÍ' FIN como resultado' - da como resultado un error, es decir,' CAST (1 AS BIT) 'no es el mismo valor lógico TRUE. – onedaywhen

Respuesta

168

Lo que tenga allí no devolverá ninguna fila si el usuario no existe. Esto es lo que necesita:

SELECT CASE WHEN EXISTS (
    SELECT * 
    FROM [User] 
    WHERE UserID = 20070022 
) 
THEN CAST(1 AS BIT) 
ELSE CAST(0 AS BIT) END 
+1

por qué usar asterisco, es mejor si usa '1' en lugar de' * '. –

+3

@ robertpeter07 - Los dos son equivalentes, pero '*' es más idiomático. Ver [esta pregunta] (http://stackoverflow.com/q/1597442/1121833). – Chad

+0

Si se usa en un ciclo WHILE, ¿debería cerrarlo entre llaves {} justo después de 'WHILE'? –

14

Posiblemente algo en este sentido:

SELECT CAST(CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END AS BIT) 
FROM dummy WHERE id = 1; 

http://sqlfiddle.com/#!3/5e555/1

+6

Esto devuelve una cadena, no un booleano –

+0

sqlfiddle está en blanco – SpringLearner

+0

Es una buena práctica incluir un nombre de columna: SELECT CAST (CASE CUANDO COUNT (*)> 0 THEN 1 ELSE 0 END AS BIT) como mycolumnname FROM dummy WHERE id = 1 –

13

Dado que comúnmente 1 = true y 0 = false, todo lo que tiene que hacer es contar el número de filas y lanzar a boolean.

Por lo tanto, su código publicado sólo tiene una función COUNT() añadido:

SELECT CAST(COUNT(1) AS BIT) AS Expr1 
FROM [User] 
WHERE (UserID = 20070022) 
+5

Hacer el 'Existe (' la prueba es mucho más rápida que hacer una prueba 'Count (1)' en tablas con un gran número de filas. –

+4

Probablemente. No hice ningún reclamo de rendimiento en mi respuesta, solo el código mínimo cambió a lograr lo que el OP quería. Sin embargo, si la columna 'UserID' está indexada (o incluso es la PK) seguramente vas directamente a la única fila que existe (o no). – Stewart

4
select CAST(COUNT(*) AS BIT) FROM [User] WHERE (UserID = 20070022) 

Si la cuenta (*) = 0 devuelve falso. Si count (*)> 0 devuelve verdadero.

0

lo hago de esta manera:

SELECT 1 FROM [dbo].[User] WHERE UserID = 20070022 

ya que un valor lógico no puede ser nulo (al menos en .NET), que en caso de incumplimiento a falso o puede configurarlo para que usted mismo si se trata de impago verdadera . Sin embargo, 1 = verdadero, tan nulo = falso y sin sintaxis adicional.

Nota: Yo uso Dapper como mi microordenador, me imagino que ADO debería funcionar igual.

Cuestiones relacionadas