Как использовать логическое поле в предложении where в SQLite?

Вроде тупой вопрос, и все же. Это может быть моя IDE, которая меня обманывает. Вот код (сгенерированный из 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

Если я выполню этот запрос, я верну три строки с двумя логическими полями Active и Public. Добавление закомментированной строки не возвращает строк. Изменение строки на любое из следующего:

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

Не работает. Либо ошибки, либо нет результатов. Я искал это в Google и обнаружил нехватку реальных SQL-запросов. И вот мы здесь.

Итак: как мне использовать логическое поле в предложении where в SQLite?

IDE является администратором SQLite.

Обновление : Ну, я нашел ответ. Администратор SQLite, очевидно, позволит вам создавать свои собственные типы; генерируемый SQL-запрос create выглядит так:

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)

Исправление для запроса

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

Настоящая проблема здесь в том, что, как указал первый ответчик, в SQLite нет логического типа. Не проблема, но о чем нужно знать. Я использую DbLinq для создания уровня данных; возможно, он не должен разрешать отображение типов, которые не поддерживает SQLite. Или он должен отображать все типы, которые не являются собственными для SQLite, в строковый тип.

Ответов (4)

Решение

SQLite не имеет логического типа: какие типы данных поддерживает SQLite?

Закомментированная строка должна работать, просто используйте в своих данных целочисленные значения 1 и 0 для представления логического значения.

SQLite не имеет встроенного логического типа - вместо этого вам нужно использовать целое число. Кроме того, когда вы сравниваете значение с «ИСТИНА» и «t», вы сравниваете его с этими значениями как строки, а не как логические или целые числа, и поэтому сравнение всегда будет неудачным.

Источник: http://www.sqlite.org/datatype3.html

Вам не нужно использовать какой-либо оператор сравнения, чтобы сравнить логическое значение в предложении where.

Если ваш логический столбец называется is_selectable, ваше предложение where будет просто: WHERE is_selectable

-> Это даст вам результат с ложным значением поля is_online

выберите * from device_master, где is_online! = 1

-> Это даст вам результат с истинным значением поля is_online

выберите * from device_master, где is_online = 1