Comment puis-je utiliser un champ booléen dans une clause where dans SQLite?

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

  •  06-09-2019
  •  | 
  •  

Question

Il semble comme une question stupide, et pourtant. Il pourrait être mon IDE qui me gaffes vers le haut. Voici le code (ce qui est généré à partir 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

Si je lance cette requête je reçois trois lignes arrière, avec deux champs booléens appelé Active et publique. Ajout de la ligne commentée retourne aucune ligne. Modification de la ligne à l'un des éléments suivants:

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

Il ne fonctionne pas. Soit des erreurs ou aucun résultat. J'ai googlé pour cela et trouvé un manque de réelles requêtes SQL là-bas. Et nous voici.

Alors: comment puis-je utiliser un champ booléen dans une clause where dans SQLite

?

IDE est SQLite administrateur.

Mise à jour : Eh bien, j'ai trouvé la réponse. SQLite Administrator vous permettra de faire en apparence vos propres types; la création SQL qui est généré ressemble à ceci:

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)

Le correctif pour la requête est

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

La vraie question ici est, comme la première answerer a souligné, il n'y a pas de type booléen dans SQLite. Pas un problème, mais quelque chose à connaître. J'utilise pour générer ma couche de données DbLinq ; peut-être il ne devrait pas permettre la cartographie des types qui SQLite ne prend pas en charge. Ou il Dirigez tous les types qui ne sont pas originaires de SQLite à un type de chaîne.

Était-ce utile?

La solution

SQLite n'a pas le type booléen: Qu'est-ce que le soutien de types de données SQLite fait

La ligne en commentaire comme il est devrait fonctionner, il suffit d'utiliser des valeurs entières de 1 et 0 dans vos données pour représenter une valeur booléenne.

Autres conseils

Vous n'avez pas besoin d'utiliser un opérateur de comparaison afin de comparer une valeur booléenne dans votre clause where.

Si votre colonne « booléenne » est nommé is_selectable, votre clause where serait tout simplement: WHERE is_selectable

SQLite n'a pas de type booléen intégré - vous devez utiliser à la place un entier. En outre, lorsque vous comparez la valeur à « true » et « t », vous comparez à ces valeurs comme des chaînes, et non comme des booléens ou des entiers, et par conséquent la comparaison échoueront toujours.

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

-> Cela vous donnera Résultat d'avoir Faux Valeur du champ is_online

select * from device_master où is_online! = 1

-> Cela vous donnera Résultat ayant valeur réelle de champ is_online

select * from device_master où is_online = 1

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top