2009-02-24 3 views
21

Кажется, немой вопрос, и все же. Это может быть моя IDE, которая меня раздражает. Вот код (это генерируется из DbLinq):Как использовать логическое поле в предложении where в SQLite?

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 

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

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

Это не работает. Либо ошибки, либо нет результатов. Я искал это для поиска и нашел недостаток в реальных 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 , Не проблема, а что-то, о чем нужно знать. Я использую DbLinq для создания слоя данных; возможно, это не должно допускать сопоставление типов, которые SQLite не поддерживает. Или он должен отображать все типы, не относящиеся к SQLite, к типу string.

ответ

16

SQLite не имеет логический тип: What datatypes does SQLite support?

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

+4

Должен быть администратором SQLite, который меня заводит.Он имеет логический тип, доступный при сборке таблицы. Но запрос на это поле всегда не дает никаких результатов. – jcollum

+0

см. Мой ответ в http://stackoverflow.com/questions/4824687/how-to-include-a-boolean-in-a-sql-lite-where-clause/16880803#16880803 – Straff

4

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

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

11

Вам не нужно использовать любой оператор сравнения, чтобы сравнить логическое значение в вашей ИНЕКЕ.

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

+0

Что это значит? Если вы пытались найти те, которые были ** не выбраны **. –

+2

WHERE NOT (is_selectable) –

+0

Просто то, что мне было нужно, спасибо @AviCherry –

-1

-> Это даст вам результат, имеющий значение Ложь в is_online поле

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

-> Это даст вам результат, имеющий истинной ценности is_online поля

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

Смежные вопросы