2009-02-24 18 views
21

Wygląda na głupie pytanie, a jednak. To może być moje IDE, które mnie wygłupia. Oto kod (ten jest generowany z DbLinq):Jak używać pola boolowskiego w klauzuli where w 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 

Jeśli uruchomić tej kwerendy uzyskać trzy wiersze z powrotem, z dwóch logicznych polach zwanych aktywny i publiczny. Dodanie w komentarzu linii nie zwraca żadnych wierszy. Zmiana linii na jedną z poniższych:

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

To nie działa. Błędy lub brak wyników. Przeszukałem go i znalazłem tam brak prawdziwych zapytań SQL. I oto jesteśmy.

Tak: jak używać pola boolowskiego w klauzuli where w SQLite?

IDE to administrator SQLite.

Aktualizacja: Cóż, znalazłem odpowiedź. Administrator SQLite pozwoli Ci najwidoczniej tworzyć własne typy; SQL tworzenia, który pobiera generowane wygląda następująco:

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) 

Rozwiązaniem dla zapytania jest

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

Prawdziwym problemem tutaj jest, jak pierwsza odpowiadającego podkreślił, nie ma logiczna typu w SQLite . Nie problem, ale coś, o czym należy pamiętać. Używam DbLinq do generowania mojej warstwy danych; może nie powinno pozwalać na mapowanie typów, których SQLite nie obsługuje. Lub powinien mapować wszystkie typy, które nie są natywne do SQLite na typ ciągu.

Odpowiedz

16

SQLite nie ma typu boolean: What datatypes does SQLite support?

Linia zakomentowanych jak to powinno działać, wystarczy użyć wartości całkowitą 1 i 0 w danych reprezentuje wartość logiczną.

+4

Musisz być administratorem SQLite, który mnie wygłupia.Ma typ boolowski dostępny podczas budowania tabeli. Ale zapytanie na tym polu zawsze nie daje żadnych wyników. – jcollum

+0

zobacz moją odpowiedź na http://stackoverflow.com/questions/4824687/how-to-include-a-boolean-in-a-sql-lite-where-clause/16880803#16880803 – Straff

4

SQLite nie ma wbudowanego typu boolowskiego - zamiast tego należy użyć liczby całkowitej. Ponadto, gdy porównujesz wartość do "TRUE" i "t", porównujesz ją z tymi wartościami jako łańcuchami, a nie jako wartościami boolowymi lub liczbami całkowitymi, dlatego porównanie zawsze kończy się niepowodzeniem.

Źródło: http://www.sqlite.org/datatype3.html

11

Nie trzeba używać żadnych operator porównania w celu porównania wartość logiczną w klauzuli WHERE.

Jeśli 'logiczna' kolumna nazywa is_selectable, twój gdzie klauzula byłoby po prostu: WHERE is_selectable

+0

Co to jest odwrotność tego? Jeśli próbujesz znaleźć te, które ** nie były do ​​wyboru **. –

+2

WHERE NOT (is_selectable) –

+0

Po prostu to, czego potrzebowałem, dzięki @AviCherry –

-1

-> To daje wynik posiadające wartość false pola is_online

select * from device_master gdzie is_online = 1

-> To daje wynik posiadające prawdziwą wartość is_online dziedzinie

wybierz * z device_master gdzie is_online = 1

Powiązane problemy