Hier, je voulais ajouter un champ booléen à une table Oracle. Cependant, il n'y a pas réellement de type de données booléen dans Oracle. Quelqu'un ici connaît-il la meilleure façon de simuler un booléen? Googler le sujet a découvert plusieurs approches
Utilisez un entier et ne vous souciez pas de lui attribuer autre chose que 0 ou 1.
Utilisez un champ de caractère avec «Y» ou «N» comme deux seules valeurs.
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?
oracle
boolean
sqldatatypes
Eli Courtwright
la source
la source
wall
type de données pour que je puisse me casser la tête contre lui lorsque j'utilise des booléens.Réponses:
J'ai trouvé ce lien utile.
Voici le paragraphe mettant en évidence certains des avantages / inconvénients de chaque approche.
Fondamentalement, ils préconisent la méthode numéro 2, par souci d'efficacité, en utilisant
getBoolean()
etc.) avec une contrainte de vérificationLeur exemple:
la source
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 ne sont que les tables qui n'en ont 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.
la source
Pour utiliser le moins d'espace, vous devez utiliser un champ CHAR contraint à «Y» ou «N». Oracle ne prend pas en charge les types de données BOOLEAN, BIT ou TINYINT, donc un octet de CHAR est aussi petit que possible.
la source
La meilleure option est 0 et 1 (sous forme de 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 que vous traitez mais une énumération avec trois valeurs ...)
Avantages de 0/1:
select sum(is_ripe) from bananas
au lieu deselect 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':
Une autre affiche a suggéré «Y» / null pour les gains de performance. Si vous avez prouvé que vous avez besoin des performances, alors c'est juste, mais sinon évitez car cela rend les requêtes moins naturelles (
some_column is null
au lieu desome_column = 0
) et dans une jointure gauche, vous confondez la fausseté avec des enregistrements inexistants.la source
Soit 1/0, soit Y / N avec une contrainte de vérification dessus. la manière éther est très bien. Personnellement, je préfère 1/0 car je fais beaucoup de travail en perl, et il est vraiment facile de faire des opérations booléennes perl sur les champs de base de données.
Si vous voulez une discussion vraiment approfondie de cette question avec l'un des honchos à la tête d'Oracles, découvrez ce que Tom Kyte a à dire à ce sujet ici
la source
La base de données sur laquelle j'ai effectué la plupart de mes travaux utilisait «Y» / «N» comme booléen. Avec cette implémentation, vous pouvez réaliser quelques astuces comme:
Comptez les lignes qui sont vraies:
SELECT SUM (CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0) FROM X
Lors du regroupement de lignes, appliquez la logique «Si une ligne est vraie, alors tout est vrai»:
SELECT MAX (BOOLEAN_FLAG) FROM Y
Inversement, utilisez MIN pour forcer le regroupement à faux si une ligne est fausse.
la source
Un exemple de travail 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
number
type):Cela crée une nouvelle colonne dans
my_table_name
appeléemy_new_boolean_column
avec les valeurs par défaut de 0. La colonne n'acceptera pas lesNULL
valeurs et restreint les valeurs acceptées à0
ou1
.la source
Dans nos bases de données, nous utilisons une énumération qui garantit que nous la transmettons TRUE ou FALSE. 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 appropriée, ou de finir avec ce champ de caractères ayant Y, y, N, n, T, t, F, f et avoir à se souvenir quelle section de code utilise quelle table et quelle version de true elle utilise.
la source