Come faccio a utilizzare un campo booleano in una clausola in cui a SQLite?
Domanda
Sembra una domanda stupida, eppure. Potrebbe essere il mio IDE che mi ha scherzano su. Ecco il codice (questo è generato da 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
Se corro questa query ottengo tre file indietro, con due campi booleani chiamati attivo e pubblico. L'aggiunta della linea commentata non restituisce alcuna riga. Cambiare la linea per una delle seguenti:
pics$.Active = 'TRUE'
pics$.Active = 't'
pics$.Active = boolean(1)
Non funziona. Sia gli errori o nessun risultato. Googled per questo e ho trovato una carenza di query SQL effettivi là fuori. Ed eccoci qui.
Quindi: Come si usa un campo booleano in una clausola dove nel SQLite
?IDE è amministratore SQLite.
Aggiorna : Beh, ho trovato la risposta. SQLite amministratore vi permetterà di fare il backup dei propri tipi apparentemente; la creazione di SQL che ottiene sguardi generate in questo modo:
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 essere a conoscenza. Sto utilizzando DbLinq per generare il mio livello di dati; forse non dovrebbe permettere la mappatura dei tipi che SQLite non supporta. O dovrebbe mappare tutti i tipi che non sono nativi SQLite per un tipo stringa.
Soluzione
SQLite non ha il tipo booleano: Quali tipi di dati supportati da SQLite ? p>
La linea commentata-out come è dovrebbe funzionare, basta usare valori interi di 1 e 0 nei dati per rappresentare un valore booleano.
Altri suggerimenti
Non è necessario utilizzare qualsiasi operatore di confronto al fine di confrontare un valore booleano in cui clausola.
Se la colonna 'booleana' prende il nome is_selectable, il tuo clausola dove sarebbe semplicemente:
WHERE is_selectable
SQLite non ha alcun tipo booleano integrato - è necessario utilizzare un intero posto. Inoltre, quando si sta confrontando il valore di 'VERO' e 't', si sta confrontando a quei valori come stringhe, non come booleani o interi, e quindi il confronto sarà sempre esito negativo.
-> 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
select * from device_master dove is_online = 1