¿Es esta la forma correcta de hacer una prueba booleana en SQL?

81

Suponga que activo es un "campo booleano" (pequeño int, con 0 o 1)

# Find all active users
select * from users where active 

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

En palabras, ¿se puede aplicar el operador "NO" directamente en el campo booleano?

Eric
fuente
Sí, como se publicó, los campos booleanos generalmente se escriben 'bit', no 'int'
Davis
Supongo que realmente busca un código atractivo, ya que sin duda sabrá que "active = 0" es una posible solución. En la elección entre "NO activo" y "activo = 0", no me molestaría. Si necesita que se le 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 alguien no debería tocar su código, por cierto ...)
Tomas Aschan
1
@Eric: en SQL, un predicado debe producir un resultado booleano. Un "donde activo" no produce tal resultado, porque incluso si "activo" fuera un tipo de datos BIT, un BIT no es un valor booleano, es un valor entero con un rango de 0..1. Por lo tanto, debe 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
Tomalak: ¡deberías haber publicado ese comentario como respuesta!
womp
@Tomalak: "En SQL, un predicado necesita producir un resultado booleano", no del todo. SQL exhibe una lógica de tres valores, es decir, VERDADERO, FALSO y DESCONOCIDO (considere que 'activo' puede ser NULO).
cuando

Respuestas:

87

Un booleano en SQL es un campo de bits. 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 */
Jose basilio
fuente
14
@ JoseBasilio- Excepto en PostgreSQL: postgresql.org/docs/9.1/static/datatype-boolean.html
Yarin
En la mayoría de las bases de datos, los campos también pueden ser NULL. Es posible que también deba verificar NULL si no configura la tabla con un valor predeterminado para el campo activo.
IAmNaN
usando SQLite dentro de Rails (4) hizo consultas usando 'f' o 't' (aunque no como caracteres). Al utilizar la consulta anterior, no funcionó. Aunque: SELECT “model".* FROM “model" WHERE “boolean_column" = ‘f'funcionó
Stefan Hendriks
25

Con Postgres, puede usar

select * from users where active

o

select * from users where active = 't'

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

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

select * from users where active = '1' -- Works 
Luc M
fuente
busqué por TODAS PARTES para averiguar si esperaba verdadero o VERDADERO o 1, por lo que su respuesta fue muy útil
jpw
4
+1 Más sobre las opciones booleanas de PostgreSQL: postgresql.org/docs/9.1/static/datatype-boolean.html
Yarin
1
Además, Posgtres acepta la sintaxis de OP: where active, where not active. Ver postgresql.org/docs/8.2/static/functions-logical.html
Loïc Faugeron
13

MS SQL 2008 también puede usar la versión de cadena de verdadero o falso ...

select * from users where active = 'true'
-- or --
select * from users where active = 'false'
Scott Ivey
fuente
Vaya, eso es genial ... No tenía idea de que funciona, pero definitivamente lo hace en 2008+ por mis pruebas.
Maxim Gershkovich
11

En SQL Server, generalmente usaría. No conozco otros motores de bases de datos.

select * from users where active = 0
Jonathan Allen
fuente
3

Personalmente prefiero usar char (1) con valores 'Y' y 'N' para bases de datos que no tienen un tipo nativo para booleano. Las letras son más fáciles de usar que los números que asumen que aquellos que las lean ahora verán que 1 corresponde a verdadero y 0 corresponde a falso.

'Y' y 'N' también se mapean muy bien cuando se usa (N) Hibernate.

todavía
fuente
0

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

Jordi Cabot
fuente
-1

Si usa SQLite3, tenga cuidado:

Solo se necesita 't' o 'f'. Ni 1 ni 0. Ni VERDADERO NI FALSO.

Acabo de aprender por las malas.

alexandros84
fuente
1
Esto no es verdad. dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.html : "Estos tipos son sinónimos de TINYINT (1). Un valor de cero se considera falso. Los valores distintos de cero se consideran verdaderos".
Moritz