Gestern wollte ich einer Oracle-Tabelle ein boolesches Feld hinzufügen. In Oracle gibt es jedoch keinen booleschen Datentyp. Kennt hier jemand den besten Weg, um einen Booleschen Wert zu simulieren? Das Googeln des Themas entdeckte mehrere Ansätze
Verwenden Sie eine Ganzzahl und weisen Sie ihr nur 0 oder 1 zu.
Verwenden Sie ein Zeichenfeld mit 'Y' oder 'N' als den einzigen beiden Werten.
Verwenden Sie eine Aufzählung mit der Einschränkung CHECK.
Wissen erfahrene Oracle-Entwickler, welcher Ansatz bevorzugt / kanonisch ist?
oracle
boolean
sqldatatypes
Eli Courtwright
quelle
quelle
wall
Datentyp, damit ich bei der Verwendung von Booleschen Werten meinen Kopf dagegen schlagen könnte.Antworten:
Ich fand diese Link nützlich.
Hier ist der Absatz, in dem einige der Vor- und Nachteile jedes Ansatzes hervorgehoben werden.
Grundsätzlich befürworten sie aus Effizienzgründen die Methode 2
getBoolean()
usw.) mit einer PrüfbedingungIhr Beispiel:
quelle
Oracle selbst verwendet J / N für boolesche Werte. Der Vollständigkeit halber sollte angemerkt werden, dass pl / sql einen booleschen Typ hat, es sind nur Tabellen, die dies nicht tun.
Wenn Sie das Feld verwenden, um anzugeben, ob der Datensatz verarbeitet werden muss oder nicht, können Sie Y und NULL als Werte verwenden. Dies führt zu einem sehr kleinen (schnell lesbaren) Index, der sehr wenig Platz benötigt.
quelle
Um möglichst wenig Speicherplatz zu nutzen, sollten Sie ein CHAR-Feld verwenden, das auf 'Y' oder 'N' beschränkt ist. Oracle unterstützt keine BOOLEAN-, BIT- oder TINYINT-Datentypen, daher ist das Byte von CHAR so klein wie möglich.
quelle
Die beste Option ist 0 und 1 (als Zahlen - eine andere Antwort schlägt 0 und 1 als CHAR vor für die aber das ist mir etwas zu verdreht), wobei NOT NULL und eine Prüfbedingung verwendet werden, um den Inhalt auf diese Werte zu beschränken. (Wenn die Spalte nullwertfähig sein soll, handelt es sich nicht um einen Booleschen Wert, sondern um eine Aufzählung mit drei Werten ...)
Vorteile von 0/1:
select sum(is_ripe) from bananas
anstelle vonselect count(*) from bananas where is_ripe = 'Y'
oder sogar (yuk) essfertig sind.select sum(case is_ripe when 'Y' then 1 else 0) from bananas
Vorteile von 'Y' / 'N':
Ein anderes Poster schlug 'Y' / null für Leistungssteigerungen vor. Wenn Sie bewiesen haben, dass Sie die Leistung benötigen, dann fair genug, aber ansonsten vermeiden, da dies das Abfragen weniger natürlich macht (
some_column is null
stattsome_column = 0
) und in einem linken Join Falschheit mit nicht vorhandenen Datensätzen in Verbindung bringt.quelle
Entweder 1/0 oder J / N mit einer Prüfbeschränkung. Äther Weg ist in Ordnung. Ich persönlich bevorzuge 1/0, da ich viel in Perl arbeite, und es macht es wirklich einfach, Perl-Boolesche Operationen an Datenbankfeldern durchzuführen.
Wenn Sie eine wirklich eingehende Erörterung dieser Frage mit einem von Oracles Kopf honchos wollen, prüfen, was Tom Kyte dazu zu sagen hat hier
quelle
Die Datenbank, an der ich den größten Teil meiner Arbeit gemacht habe, verwendete 'Y' / 'N' als Boolesche Werte. Mit dieser Implementierung können Sie einige Tricks ausführen wie:
Zählen Sie die zutreffenden Zeilen: SELECT SUM (CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0) FROM X.
Erzwingen Sie beim Gruppieren von Zeilen die Logik "Wenn eine Zeile wahr ist, sind alle wahr": SELECT MAX (BOOLEAN_FLAG) FROM Y
Verwenden Sie umgekehrt MIN, um die Gruppierung false zu erzwingen, wenn eine Zeile false ist.
quelle
Ein funktionierendes Beispiel zum Implementieren der akzeptierten Antwort durch Hinzufügen einer "Booleschen" Spalte zu einer vorhandenen Tabelle in einer Oracle-Datenbank (unter Verwendung des
number
Typs):Dadurch wird eine neue
my_table_name
aufgerufene Spaltemy_new_boolean_column
mit den Standardwerten 0 erstellt. Die Spalte akzeptiert keineNULL
Werte und beschränkt die akzeptierten Werte auf entweder0
oder1
.quelle
In unseren Datenbanken verwenden wir eine Aufzählung, die sicherstellt, dass wir sie entweder TRUE oder FALSE übergeben. Wenn Sie eine der beiden ersten Methoden ausführen, ist es zu einfach, der Ganzzahl entweder eine neue Bedeutung hinzuzufügen, ohne ein ordnungsgemäßes Design zu durchlaufen, oder das Zeichenfeld mit Y, y, N, n, T, t, zu erhalten. F, f Werte und sich merken müssen, welcher Codeabschnitt welche Tabelle verwendet und welche Version von true verwendet wird.
quelle