2009-02-24 19 views
21

Parece una pregunta tonta, y sin embargo. Podría ser mi IDE el que me está fastidiando. Aquí está el código (esto se genera a partir de DbLinq):¿Cómo uso un campo booleano en una cláusula where en SQLite?

SELECT pics$.Caption, pics$.Id, pics$.Path, pics$.Public, pics$.Active, portpics$.PortfolioID 
FROM main.Pictures pics$ 
inner join main.PortfolioPictures portpics$ on pics$.Id = portpics$.PictureId 

WHERE portpics$.PortfolioId = 1 AND pics$.Id > 0 
--AND pics$.Active = 1 AND pics$.Public = 1 
ORDER BY pics$.Id 

Si me quedo esta consulta consigo tres filas más atrás, con dos campos booleanos llamadas activa y pública. Agregar en la línea comentada no devuelve filas. Cambiar la línea a cualquiera de los siguientes:

pics$.Active = 'TRUE' 
pics$.Active = 't' 
pics$.Active = boolean(1) 

No funciona. O errores o sin resultados. Busqué en Google esto y encontré la escasez de consultas SQL reales. Y aquí estamos.

Entonces, ¿cómo utilizo un campo booleano en una cláusula where en SQLite?

IDE es Administrador de SQLite.

Actualización: Bueno, encontré la respuesta. Administrador de SQLite le permitirá inventar sus propios tipos aparentemente; SQL crear que se genera el siguiente aspecto:

CREATE TABLE [Pictures] ([Id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
[Path] VARCHAR(50) UNIQUE NOT NULL,[Caption] varchAR(50) NULL, 
[Public] BOOLEAN DEFAULT '0' NOT NULL,[Active] BOOLEAN DEFAULT '1' NOT NULL) 

La corrección para la consulta es

AND pics$.Active = 'Y' AND pics$.Public = 'Y' 

La verdadera cuestión aquí es, como el primer respondedor señaló, no hay ningún tipo booleano en SQLite . No es un problema, pero es algo a tener en cuenta. Estoy usando DbLinq para generar mi capa de datos; tal vez no debería permitir el mapeo de tipos que SQLite no admite. O debe asignar todos los tipos que no son nativos de SQLite a un tipo de cadena.

Respuesta

16

SQLite no tiene el tipo booleano: What datatypes does SQLite support?

La línea comentada, ya que es debería funcionar, sólo tiene que utilizar valores enteros de 1 y 0 en los datos para representar un valor lógico.

+4

Debe ser el administrador SQLite que me está engañando.Tiene un tipo booleano disponible cuando construyes la tabla. Pero consultar en ese campo siempre no da resultados. – jcollum

+0

ver mi respuesta en http://stackoverflow.com/questions/4824687/how-to-include-a-boolean-in-a-sql-lite-where-clause/16880803#16880803 – Straff

4

SQLite no tiene un tipo booleano incorporado; en su lugar, debe usar un número entero. Además, cuando comparas el valor con 'TRUE' y 't', lo estás comparando con esos valores como cadenas, no como booleanos o enteros, y por lo tanto la comparación siempre fallará.

Fuente: http://www.sqlite.org/datatype3.html

11

No es necesario utilizar cualquier operador de comparación para comparar un valor booleano en su cláusula where.

Si su columna 'booleano' es el nombre is_selectable, su cláusula where sería simplemente: WHERE is_selectable

+0

¿Qué opina de esto? Si estabas tratando de encontrar aquellos que ** no eran seleccionables **. –

+2

DONDE NO (is_selectable) –

+0

Justo lo que necesitaba, gracias @AviCherry –

-1

-> Esto le dará Resultado tener Falso valor del campo is_online

seleccionar * de device_master ! = 1 donde is_online

-> Esto le dará Resultado tener verdadero valor del campo is_online

select * from device_master donde is_online = 1

Cuestiones relacionadas