2009-05-13 15 views
43

Supongamos activo es un "campo booleano" (pequeña int, con 0 o 1)¿Es esta la forma correcta de hacer una prueba booleana en SQL?

# Find all active users 
select * from users where active 

# Find all inactive users 
select * from users where NOT active 

En palabras, ¿puede la "NOT" operador puede aplicar directamente en el campo booleano?

+0

Sí, como se publicó, los campos booleanos suelen escribirse 'bit', no 'int' – Davis

+0

Supongo que realmente buscas un código atractivo, ya que sin duda estarías al tanto de que "active = 0" es un posible solución. En la elección entre "NO activo" y "activo = 0", no me molestaría, si necesita que se lo explique, agregue un comentario. (En caso de que alguien que trabaje con el código en el futuro no entienda la relación verdadero/falso <-> 1/0, tal vez ese alguien no debería tocar su código, por cierto ...) –

+1

@Eric: En SQL, un predicado necesita producir un resultado booleano. Un "donde esté activo" no produce dicho resultado, porque incluso si 'activo' era un tipo de datos BIT - un BIT no es un valor booleano, es un valor entero con un rango de 0..1. Entonces * debes * hacer una comparación de algún tipo para producir un booleano. "donde NO (activo = 1)" funcionaría, pero no "donde NO está activo". – Tomalak

Respuesta

7

En SQL Server generalmente usaría. No sé sobre otros motores de base de datos.

select * from users where active = 0 
46

Un booleano en SQL es un campo de bit. Esto significa 1 o 0. La sintaxis correcta es:

select * from users where active = 1 /* All Active Users */ 

o

select * from users where active = 0 /* All Inactive Users */ 
+7

@ JoseBasilio- Excepto en PostgreSQL: http://www.postgresql.org/docs/9.1/static/datatype-boolean.html – Yarin

+0

En la mayoría de los DB, los campos también pueden ser NULL. Es posible que deba verificar también NULL si no configura la tabla con un valor predeterminado para el campo activo. – IAmNaN

+0

usando SQLite dentro de Rails (4) hizo consultas usando 'f' o 't' (aunque no como caracteres). Al usar la consulta anterior, no funcionó. Aunque: '' 'SELECT" modelo ". * FROM" modelo "WHERE" boolean_column "= 'f'''' trabajado –

10

MS SQL 2008 también se puede utilizar la versión de serie de verdadero o falso ...

select * from users where active = 'true' 
-- or -- 
select * from users where active = 'false' 
+0

Guau, eso es genial ... No tenía idea de que funciona pero definitivamente en 2008+ de mis pruebas –

13

Con Postgres, puede usar

select * from users where active 

o

select * from users where active = 't' 

Si desea usar un valor entero, debe considerarlo como una cadena. No puede usar el valor entero.

select * from users where active = 1 -- Does not work 

select * from users where active = '1' -- Works 
+0

buscó TODO para encontrar si esperaba VERDADERO o VERDADERO o 1, por lo que su respuesta fue muy útil – jpwynn

+4

+1 Más sobre las opciones booleanas de PostgreSQL: http://www.postgresql.org/docs/9.1/static/datatype- boolean.html – Yarin

+0

Aslo, Posgtres acepta la sintaxis de OP: 'where active',' where no active'. Consulte http://www.postgresql.org/docs/8.2/static/functions-logical.html –

3

personalmente prefiero usar char (1) con los valores 'y' y 'N' para bases de datos que no tienen un tipo nativo para booleana. Las letras son más sencillas para el usuario que los números que suponen que aquellos que lo leen ahora serán 1 que corresponde a verdadero y 0 corresponde a falso.

'Y' y 'N' también se asocian bien cuando se utiliza (N) Hibernate.

0

PostgreSQL admite tipos booleanos, por lo que su consulta SQL funcionaría perfectamente en PostgreSQL.

-1

Si u r utilizando SQLite3 cuidado:

Se tarda sólo 't' o 'f'. No 1 o 0. No es VERDADERO O FALSO.

Acabo de aprender de la manera difícil.

Cuestiones relacionadas