Como faço para usar um campo boolean em uma cláusula onde, em SQLite?
Pergunta
Parece uma pergunta idiota, e ainda. Poderia ser o meu IDE que está me gozando-se. Aqui está o código (este é gerado a partir DbLinq):
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
Se eu executar essa consulta eu recebo três fileiras atrás, com dois campos boolean chamados activo e público. Adicionando na linha comentada retorna nenhuma linha. Alterar a linha para qualquer um dos seguintes:
pics$.Active = 'TRUE'
pics$.Active = 't'
pics$.Active = boolean(1)
Ele não funciona. Tanto erros ou nenhum resultado. Eu pesquisei para isso e encontrou uma escassez de consultas SQL reais lá fora. E aqui estamos.
Assim: como faço para usar um campo boolean em uma cláusula onde, em SQLite
IDE é Administrador SQLite.
Atualizar : Bem, eu encontrei a resposta. SQLite Administrator vai deixar você fazer backup de seus próprios tipos aparentemente; a criar SQL que obtém olhares gerados assim:
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)
A correção para a consulta é
AND pics$.Active = 'Y' AND pics$.Public = 'Y'
A verdadeira questão aqui é, como o primeiro respondente assinalou, não há nenhum tipo boolean em SQLite. Não é um problema, mas algo para estar ciente. Eu estou usando DbLinq para gerar a minha camada de dados; talvez ele não deve permitir o mapeamento de tipos que SQLite não suporta. Ou deve mapear todos os tipos que não são nativas para SQLite para um tipo de cadeia.
Solução
SQLite não tem o tipo boolean: Que tipos de dados suportados pelo SQLite ? p>
A linha comentada-out como é deve funcionar, basta usar inteiro valores de 1 e 0 em seus dados para representar um boolean.
Outras dicas
Você não precisa usar qualquer operador de comparação para comparar um valor booleano em sua cláusula WHERE.
Se a sua coluna 'booleano' é nomeado is_selectable, sua cláusula onde seria simplesmente:
WHERE is_selectable
SQLite não tem built-in tipo booleano - você tem que usar um inteiro em vez. Além disso, quando você está comparando o valor para 'TRUE' e 't', você está comparando-a com aqueles valores como strings, não como booleans ou inteiros e, portanto, a comparação será sempre falham.
-> Isto lhe dará Resultado ter valor false de campo is_online
SELECT * FROM device_master onde is_online! = 1
-> Isto lhe dará Resultado ter verdadeiro valor do campo is_online
SELECT * FROM device_master onde is_online = 1