2009-02-24 12 views
21

Sembra una domanda stupida, eppure. Potrebbe essere il mio IDE che mi sta prendendo in giro. Ecco il codice (questo è generato da DbLinq):Come si usa un campo booleano in una clausola where in 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 

Se corro questa domanda ho tre file indietro, con due campi booleani chiamati attivo e pubblico. L'aggiunta alla riga commentata non restituisce righe. Modifica della linea in uno dei seguenti:

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

Non funziona. Errori o nessun risultato. Ho cercato su google per questo e ho trovato una carenza di query SQL reali là fuori. Ed eccoci qui.

Quindi: come utilizzare un campo booleano in una clausola where in SQLite?

IDE è amministratore SQLite.

Aggiornamento: Bene, ho trovato la risposta. SQLite Administrator ti permetterà di creare i tuoi tipi apparentemente; SQL creare che viene generato assomiglia a questo:

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) 

La correzione per la query è

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

Il vero problema qui è, come la prima risposto sottolineato, non v'è alcun tipo booleano in SQLite . Non è un problema, ma qualcosa di cui essere a conoscenza. Sto usando DbLinq per generare il mio livello dati; forse non dovrebbe consentire la mappatura dei tipi che SQLite non supporta. O dovrebbe mappare tutti i tipi che non sono nativi di SQLite per un tipo di stringa.

risposta

16

SQLite non ha il tipo booleano: What datatypes does SQLite support?

La linea commentata-out come è dovrebbe funzionare, basta usare valori interi di 1 e 0 nei dati per rappresentare un valore booleano.

+4

Deve essere SQLite Administrator che mi sta confondendo.Ha un tipo booleano disponibile quando costruisci il tavolo. Ma l'interrogazione su quel campo non dà mai risultati. – jcollum

+0

vedi la mia risposta in http://stackoverflow.com/questions/4824687/how-to-include-a-boolean-in-a-sql-lite-where-clause/16880803#16880803 – Straff

4

SQLite non ha un tipo booleano incorporato: è necessario utilizzare un numero intero. Inoltre, quando stai confrontando il valore con "TRUE" e "t", lo stai confrontando con questi valori come stringhe, non come booleani o interi, e quindi il confronto fallirà sempre.

Fonte

: http://www.sqlite.org/datatype3.html

11

Non è necessario utilizzare qualsiasi operatore di confronto al fine di confrontare un valore booleano nel vostro clausola dove.

Se la colonna 'booleana' prende il nome is_selectable, il tuo clausola WHERE sarebbe semplicemente: WHERE is_selectable

+0

Qual è il contrario di questo? Se stavi cercando di trovare quelli che erano ** non selezionabili **. –

+2

WHERE NOT (is_selectable) –

+0

Proprio quello di cui avevo bisogno, grazie @AviCherry –

-1

-> questo vi darà Risultato avendo valore falso di campo is_online

select * from device_master ! dove is_online = 1

-> questo vi darà Risultato avendo vero valore di campo is_online

seleziona * dal dispositivo_master dove is_online = 1

Problemi correlati