336 votes

Y a-t-il un type booléen dans les bases de données Oracle ?

Y a-t-il un type Boolean dans les bases de données Oracle, similaire au type BIT dans Ms SQL Server?

9 votes

Malheureusement, Oracle ne prend pas en charge pleinement la norme ANSI SQL:1999 (en.wikipedia.org/wiki/SQL:1999) lors de son introduction.

2 votes

Point de vue alternatif (pourquoi SQL ne devrait pas avoir un type booléen) : vadimtropashko.wordpress.com/2010/09/16/…

18 votes

@JeffreyKemp Ce blog n'a aucun sens. Juste parce que certaines valeurs booléennes peuvent être calculées en fonction d'autres champs dans une table, ne signifie pas que tous les champs booléens peuvent être calculés. Par exemple "is_trusted_customer" où cela est vrai si et seulement si un humain décide, "Je fais confiance à cette personne."

359voto

ammoQ Points 17866

Avant la version 23c (2023), non seulement le type de données booléen était absent du SQL d'Oracle (pas du PL/SQL), mais il n'y avait également aucune recommandation claire sur ce qu'il fallait utiliser à la place. Voir ce fil de discussion sur asktom. En passant de CHAR(1) 'Y'/'N' à NUMBER(1) 0/1 lorsqu'on souligne que 'Y'/'N' dépend de la langue anglaise, alors que par exemple les programmeurs allemands pourraient utiliser 'J'/'N' à la place.

Le pire est qu'ils défendent cette décision stupide comme ils défendent la stupidité de ''=NULL.


Oracle 23c prend enfin en charge les types de données booléens dans tous les contextes, ainsi que plusieurs autres fonctionnalités qui lui ont fait défaut par rapport aux autres bases de données.

SQL> select true;

TRUE
-----------
TRUE

SQL> create table test1(a boolean);

Table created.

SQL> insert into test1 values (true),(false),(to_boolean(0)),(to_boolean('y'));

4 lignes créées.

Mais le problème de la chaîne vide ne changera jamais.

17 votes

1/0 est, sinon ambigu, au moins moins ambigu.

1 votes

Je préfère aussi 1/0, mais bien sûr vous trouverez également des personnes ayant une expérience en Visual Basic qui choisiront -1/0 à la place. À mon avis, il n'y a qu'une seule solution raisonnable à ce problème : Oracle devrait créer un type de données booléen. Ce ne peut pas être si difficile quand presque tous les autres SGBDR en ont un.

30 votes

Mais ''=NULL est faux! '' IS NULL est vrai. :)

80voto

Bohdan Points 1882

Non.

Peut utiliser:

IS_COOL NUMBER(1,0)

1 - vrai
0 - faux

--- profitez d'Oracle

Ou utiliser char Y/N comme décrit ici

7 votes

Je préfère char(1) car il utilise moins d'espace. Vous pouvez le vérifier de cette manière : create table testbool (boolc char(1), booln number(1)); insert into testbool values ('Y', 1 ); select dump(boolc), dump(booln) from testbool; Ce CHAR est stocké : Typ=96 Len=1: 89 et ce NUMBER : Typ=2 Len=2: 193,2 Au moins en 12c, NUMBER(1) peut utiliser 2 octets...

4 votes

Venir d'un contexte Java, la spécification JDBC de ResultSet.getBoolean() indique: Si la colonne désignée a un type de données CHAR ou VARCHAR et contient un "0" ou a un type de données BIT, TINYINT, SMALLINT, INTEGER ou BIGINT et contient un 0, une valeur de faux est renvoyée. Si la colonne désignée a un type de données CHAR ou VARCHAR et contient un "1" ou a un type de données BIT, TINYINT, SMALLINT, INTEGER ou BIGINT et contient un 1, une valeur de vrai est renvoyée. -- Sur la base de cela, je recommanderais la solution 0/1 plutôt que Y/N. Même en utilisant une colonne CHAR, il est préférable d'utiliser des nombres.

0 votes

@phil_w En tant qu'ancien programmeur C, je préfère TRUE = 1 et FALSE = 0 dans les assertions logiques, et tout ce qui n'est pas nul est vrai. Le choix entre nombre et caractère est un compromis entre vitesse et taille car les nombres n'ont jamais besoin de passer par une conversion de jeu de caractères tandis que les caractères le font fréquemment.

15voto

vc 74 Points 15694

Pas au niveau SQL et c'est dommage Il y en a un en PLSQL cependant

9voto

kupa Points 947

Non, le type booléen n'existe pas, mais vous pouvez utiliser 1/0 (type nombre), ou 'Y'/ 'N' (type caractère), ou 'true'/'false' (type varchar2) à la place.

6voto

Il existe un type booléen à utiliser en pl/sql, mais aucun ne peut être utilisé comme type de données d'une colonne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X