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

StackOverflow https://stackoverflow.com/questions/580668

  •  06-09-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top