Как использовать логическое поле в предложении where в SQLite? - PullRequest
23 голосов
/ 24 февраля 2009

Кажется глупым вопросом, и все же. Это может быть моя 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)

Это не работает. Либо ошибки, либо нет результатов. Я гуглил по этому поводу и обнаружил недостаток реальных запросов 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 ]

18 голосов
/ 24 февраля 2009

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

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

15 голосов
/ 26 июля 2012

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

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

4 голосов
/ 24 февраля 2009

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

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

0 голосов
/ 09 августа 2017

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

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

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

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

...