type - oracle sql is true




Champ booléen dans Oracle (6)

Dans nos bases de données, nous utilisons une énumération qui garantit que nous passons soit VRAI ou FAUX. Si vous le faites de l'une des deux premières façons, il est trop facile de commencer à ajouter une nouvelle signification à l'entier sans passer par une conception correcte, ou finir avec ce champ char ayant Y, y, N, n, T, t, F, f valeurs et avoir à se rappeler quelle section de code utilise quelle table et quelle version de vrai il utilise.

Hier, j'ai voulu ajouter un champ booléen à une table Oracle. Cependant, il n'existe pas de type de données booléen dans Oracle. Est-ce que quelqu'un ici connaît la meilleure façon de simuler un booléen? Googler le sujet a découvert plusieurs approches

  1. Utilisez un nombre entier et ne vous embêtez pas à lui assigner autre chose que 0 ou 1.

  2. Utilisez un champ char avec 'Y' ou 'N' comme les deux seules valeurs.

  3. Utilisez une énumération avec la contrainte CHECK.

Les développeurs Oracle expérimentés savent-ils quelle approche est préférée / canonique?


J'ai trouvé this lien utile.

Voici le paragraphe mettant en évidence certains des avantages / inconvénients de chaque approche.

La conception la plus courante consiste à imiter les nombreux indicateurs de type booléen que les vues de dictionnaire de données d'Oracle utilisent, en sélectionnant 'Y' pour true et 'N' pour false. Toutefois, pour interagir correctement avec les environnements hôtes, tels que JDBC, OCCI et d'autres environnements de programmation, il est préférable de sélectionner 0 pour false et 1 pour true afin qu'il puisse fonctionner correctement avec les fonctions getBoolean et setBoolean.

Fondamentalement, ils préconisent la méthode numéro 2, par souci d'efficacité, en utilisant

  • valeurs de 0/1 (en raison de l'interopérabilité avec getBoolean() etc. de JDBC) avec une contrainte de vérification
  • un type de CHAR (car il utilise moins d'espace que NUMBER).

Leur exemple:

create table tbool (bool char check (bool in (0,1));
insert into tbool values(0);
insert into tbool values(1);`

La meilleure option est 0 et 1 (comme les nombres - une autre réponse suggère 0 et 1 comme CHAR pour l'efficacité de l'espace mais c'est un peu trop tordu pour moi), en utilisant NOT NULL et une contrainte de vérification pour limiter le contenu à ces valeurs. (Si vous avez besoin que la colonne soit nullable, alors ce n'est pas un booléen mais une énumération avec trois valeurs ...)

Avantages de 0/1:

  • Langue indépendante. 'Y' et 'N' iraient bien si tout le monde l'utilisait. Mais ils ne le font pas. En France, ils utilisent 'O' et 'N' (j'ai vu cela de mes propres yeux). Je n'ai pas programmé en Finlande pour voir s'ils utilisent 'E' et 'K' là - sans aucun doute ils sont plus intelligents que cela, mais vous ne pouvez pas être sûr.
  • Conforme à la pratique dans les langages de programmation largement utilisés (C, C ++, Perl, Javascript)
  • Joue mieux avec la couche d'application, par exemple Hibernate
  • Conduit à un SQL plus succinct, par exemple, pour savoir combien de bananes sont prêtes à manger, select sum(is_ripe) from bananas au lieu de select count(*) from bananas where is_ripe = 'Y' ou même (yuk) select sum(case is_ripe when 'Y' then 1 else 0) from bananas

Avantages de 'Y' / 'N':

  • Prend moins d'espace que 0/1
  • C'est ce que suggère Oracle, donc peut-être ce que certaines personnes sont plus habitués à

Une autre affiche a suggéré 'Y' / null pour les gains de performance. Si vous avez prouvé que vous avez besoin de la performance, alors some_column is null , sinon évitez car cela rend la requête moins naturelle ( some_column is null au lieu de some_column = 0 ) et dans une jointure à gauche vous confondez la fausseté avec des enregistrements inexistants.


Oracle lui-même utilise Y / N pour les valeurs booléennes. Pour être complet, il convient de noter que pl / sql a un type booléen, ce sont seulement les tables qui ne le font pas.

Si vous utilisez le champ pour indiquer si l'enregistrement doit être traité ou non, vous pouvez envisager d'utiliser Y et NULL comme valeurs. Cela fait un très petit index (lecture rapide) qui prend très peu de place.


Soit 1/0 ou Y / N avec une contrainte de vérification. façon éther est bien. Personnellement, je préfère 1/0 car je fais beaucoup de travail en perl, et il est très facile de faire des opérations booléennes perl sur les champs de base de données.

Si vous voulez une discussion approfondie de cette question avec l'un des orchos d'Oracles, regardez ce que Tom Kyte a à dire à ce sujet.


Un exemple pratique pour implémenter la réponse acceptée en ajoutant une colonne "Boolean" à une table existante dans une base de données Oracle (en utilisant le type de number ):

ALTER TABLE my_table_name ADD (
my_new_boolean_column number(1) DEFAULT 0 NOT NULL
CONSTRAINT my_new_boolean_column CHECK (my_new_boolean_column in (1,0))
);

Cela crée une nouvelle colonne dans my_table_name appelée my_new_boolean_column avec des valeurs par défaut de 0. La colonne n'acceptera pas les valeurs NULL et restreint les valeurs acceptées à 0 ou 1 .





sqldatatypes