¿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?


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 */

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 

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'

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

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.


0

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


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.