web-dev-qa-db-fra.com

Existe-t-il un littéral booléen dans SQLite?

Je connais le type booleancolumn, mais existe-t-il un booleanliteral dans SQLite? Dans d'autres langues, il peut s'agir de true ou false. Évidemment, je peux utiliser 0 et 1, mais j'ai tendance à éviter autant que possible les "nombres magiques".

D'après cette liste , il semble que cela puisse exister dans d'autres implémentations SQL, mais pas dans SQLite. (J'utilise SQLite 3.6.10, pour ce que ça vaut.)

54
Benjamin Oakes

De la section 1.1 Type de données booléen de la documentation:

SQLite n'a pas de classe de stockage booléenne séparée. Au lieu de cela, les valeurs booléennes sont stockées en tant que nombres entiers 0 (faux) et 1 (vrai).

On dirait que vous êtes coincé avec 0 et 1.

75
Justin Ethier

1.1 Type de données booléen 

SQLite n'a pas de classe de stockage booléenne séparée. Au lieu de cela, les valeurs booléennes sont stockées en tant que nombres entiers 0 (faux) et 1 (vrai).

Docs

8
Andrey

La question ne concerne pas explicitement le type de colonne (c.-à-d. Stockage) mais l'utilisation des littéraux TRUE et FALSE (c.-à-d. Analyseurs), compatibles avec SQL comme d'après la documentation relative aux mots-clés de PostgreSQL (qui inclut également les colonnes SQL-92, SQL: 2008 et SQL: 2011 dans la table de référence).

La documentation de SQLite répertorie tous les mots-clés pris en charge , et cette liste ne contient ni TRUE ni FALSE; SQLite n'est donc malheureusement pas conforme à cet égard.

Vous pouvez également le tester facilement et voir comment l’analyseur fait des barfs quand il veut que le jeton soit un nom de colonne:

$ sqlite3 :memory:
SQLite version 3.14.0 2016-07-26 15:17:14
sqlite> CREATE TABLE foo (booleanish INT);
sqlite> INSERT INTO foo (booleanish) VALUES (TRUE);
Error: no such column: TRUE
6
Lloeki

Existe-t-il un littéral booléen dans SQLite?

Comme indiqué dans réponse de Justin Ethier , SQLite n'a pas de type de données spécifique pour le booléen. Mais à partir de SQLite 3.23.0 , il prend en charge les littéraux vrai/faux:

  1. Reconnaître VRAI et FAUX en tant que constantes. (Pour des raisons de compatibilité, s'il existe des colonnes nommées "true" ou "false", les identificateurs font référence aux colonnes plutôt qu'aux constantes booléennes.)

  2. Opérateurs de soutien IS VRAI, IS FAUX, IS NON VRAI et IS NON FAUX. 

SELECT true AS t, false AS f;

SELECT 'condition is true'
WHERE 1 IS NOT FALSE;

CREATE TABLE a (id INT, b BOOLEAN DEFAULT(TRUE));
INSERT INTO a(id) VALUES(100);
SELECT * FROM a;
-- id  b
-- 100 1

DÉMO DBFIDDLE.COM

4
Lukasz Szozda

SQLite n'a pas de type booléen, vous devez utiliser INTEGER, 0 étant faux et 1 vrai

0
Tung Nguyen

Il n'y a pas de type de données booléen. Il n'y a que 5 types, listés ici . Les entiers peuvent être stockés avec différentes largeurs sur le disque, le plus petit étant 1 octet. Cependant, ceci est un détail d'implémentation:

"Mais dès que les valeurs INTEGER sont lues sur le disque et enregistrées en mémoire pour le traitement de , Elles sont converties au type de données le plus général .__ (8 octets signés Entier)."

Cela dit, il n’est pas surprenant qu’il n’y ait pas de littéraux booléens.

0
Matthew Flaschen