Как использовать логическое поле в предложении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 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 нет логического типа.Это не проблема, но о чем следует знать.я использую ДбЛинк для создания моего уровня данных;возможно, он не должен позволять отображать типы, которые SQLite не поддерживает.Или он должен сопоставить все типы, которые не являются собственными для SQLite, со строковым типом.
Решение
SQLite не имеет логического типа: Какие типы данных поддерживает SQLite?
Закомментированная строка должна работать, просто используйте в своих данных целочисленные значения 1 и 0 для представления логического значения.
Другие советы
Вам не нужно использовать какой-либо оператор сравнения, чтобы сравнить логическое значение в предложенииwhere.
Если ваш «логический» столбец называется is_selectable, ваше предложениеwhere будет просто:
WHERE is_selectable
В SQLite нет встроенного логического типа — вместо этого вам придется использовать целое число.Кроме того, когда вы сравниваете значение с «ИСТИНА» и «t», вы сравниваете его с этими значениями как строки, а не как логические значения или целые числа, и поэтому сравнение всегда будет неудачным.
Источник: http://www.sqlite.org/datatype3.html
--> Это даст вам результат с ложным значением поля is_online
выберите * из device_master, где is_online!=1
--> Это даст вам результат, имеющий истинное значение поля is_online
выберите * из device_master, где is_online=1