Ayer quería agregar un campo booleano a una tabla Oracle. Sin embargo, en realidad no hay un tipo de datos booleanos en Oracle. ¿Alguien aquí sabe la mejor manera de simular un booleano? Googleando el tema descubrió varios enfoques
Use un número entero y no se moleste en asignarle nada más que 0 o 1.
Use un campo de caracteres con 'Y' o 'N' como los únicos dos valores.
Use una enumeración con la restricción CHECK.
¿Los desarrolladores experimentados de Oracle saben qué enfoque es el preferido / canónico?
oracle
boolean
sqldatatypes
Eli Courtwright
fuente
fuente
wall
tipo de datos para poder golpearme la cabeza cuando usara booleanos.Respuestas:
Encontré este enlace útil.
Aquí está el párrafo que destaca algunos de los pros / contras de cada enfoque.
Básicamente abogan por el método número 2, por el bien de la eficiencia, utilizando
getBoolean()
etc.) con una restricción de verificaciónSu ejemplo:
fuente
Oracle mismo usa Y / N para valores booleanos. Para completar, debe tenerse en cuenta que pl / sql tiene un tipo booleano, solo las tablas no lo tienen.
Si está utilizando el campo para indicar si el registro necesita ser procesado o no, puede considerar usar Y y NULL como valores. Esto genera un índice muy pequeño (lectura rápida) que ocupa muy poco espacio.
fuente
Para usar la menor cantidad de espacio, debe usar un campo CHAR restringido a 'Y' o 'N'. Oracle no es compatible con los tipos de datos BOOLEAN, BIT o TINYINT, por lo que el byte de CHAR es lo más pequeño posible.
fuente
La mejor opción es 0 y 1 (como números; otra respuesta sugiere 0 y 1 como CHAR para la eficiencia espacial, pero eso es demasiado retorcido para mí), usando NOT NULL y una restricción de verificación para limitar el contenido a esos valores. (Si necesita que la columna sea anulable, no se trata de un booleano sino de una enumeración con tres valores ...)
Ventajas de 0/1:
select sum(is_ripe) from bananas
lugar deselect count(*) from bananas where is_ripe = 'Y'
o incluso (yuk)select sum(case is_ripe when 'Y' then 1 else 0) from bananas
Ventajas de 'Y' / 'N':
Otro póster sugería 'Y' / nulo para ganancias de rendimiento. Si ha demostrado que necesita el rendimiento, entonces es lo suficientemente justo, pero evítelo ya que hace que las consultas sean menos naturales (en
some_column is null
lugar desome_column = 0
) y en una unión izquierda combinará la falsedad con registros inexistentes.fuente
Ya sea 1/0 o Y / N con una restricción de verificación. El camino del éter está bien. Personalmente prefiero 1/0 ya que hago mucho trabajo en perl, y hace que sea realmente fácil hacer operaciones booleanas en campos de bases de datos.
Si quieres una discusión realmente profunda de esta pregunta con uno de los principales jefes de Oracles, mira lo que Tom Kyte tiene para decir sobre esto Aquí
fuente
La base de datos en la que hice la mayor parte de mi trabajo utilizaba 'Y' / 'N' como booleanos. Con esa implementación, puedes realizar algunos trucos como:
Cuente las filas que son verdaderas:
SELECCIONE SUMA (CASO CUANDO BOOLEAN_FLAG = 'Y' ENTONCES 1 OTRO 0) DESDE X
Al agrupar filas,
imponga la lógica "Si una fila es verdadera, entonces todas son verdaderas": SELECCIONE MAX (BOOLEAN_FLAG) DE Y
Por el contrario, use MIN para forzar la agrupación falsa si una fila es falsa.
fuente
Un ejemplo de trabajo para implementar la respuesta aceptada agregando una columna "booleana" a una tabla existente en una base de datos Oracle (usando el
number
tipo):Esto crea una nueva columna en
my_table_name
llamadamy_new_boolean_column
con valores predeterminados de 0. La columna no aceptaráNULL
valores y restringirá los valores aceptados a cualquiera0
o1
.fuente
En nuestras bases de datos usamos una enumeración que asegura que la pasemos VERDADERO o FALSO. Si lo hace en cualquiera de las dos primeras formas, es demasiado fácil comenzar a agregar un nuevo significado al entero sin pasar por un diseño adecuado, o terminar con ese campo de caracteres que tiene Y, y, N, n, T, t, F, f valores y tener que recordar qué sección de código usa qué tabla y qué versión de true está usando.
fuente