funcion - tipo de dato boolean en oracle 12c
Campo booleano en Oracle (8)
En nuestras bases de datos usamos una enumeración que asegura que la pasemos VERDADERO o FALSO. Si lo hace de las dos primeras maneras, es demasiado fácil comenzar a agregar un nuevo significado al entero sin pasar por un diseño apropiado, 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 verdad está usando.
Ayer quise agregar un campo booleano a una tabla de Oracle. Sin embargo, en realidad no existe un tipo de datos booleanos en Oracle. ¿Alguien aquí sabe la mejor manera de simular un booleano? Google buscando el tema descubrió varios enfoques
Use un número entero y simplemente no se moleste en asignarle nada que no sea 0 o 1.
Utilice un campo char con ''Y'' o ''N'' como los dos únicos valores.
Use una enumeración con la restricción CHECK.
¿Los desarrolladores experimentados de Oracle saben qué enfoque es preferible / canónico?
Encontré this enlace útil.
Aquí está el párrafo que resalta algunos de los pros / contras de cada enfoque.
El diseño más comúnmente visto es imitar los muchos indicadores booleanos que usan las vistas de diccionario de datos de Oracle, seleccionando ''Y'' para verdadero y ''N'' para falso. Sin embargo, para interactuar correctamente con entornos host, como JDBC, OCCI y otros entornos de programación, es mejor seleccionar 0 para falso y 1 para verdadero para que pueda funcionar correctamente con las funciones getBoolean y setBoolean.
Básicamente, defienden el método número 2, por el bien de la eficiencia, utilizando
- valores de 0/1 (debido a la interoperabilidad con
getBoolean()
JDBC) con una restricción de verificación - un tipo de CHAR (porque usa menos espacio que NUMBER).
Su ejemplo:
create table tbool (bool char check (bool in (0,1)); insert into tbool values(0); insert into tbool values(1);`
La base de datos en la que hice la mayor parte de mi trabajo usó ''Y'' / ''N'' como booleanos. Con esa implementación, puede realizar algunos trucos como:
Cuente las filas que son verdaderas:
SELECCIONAR SUMA (CASO CUANDO BOOLEAN_FLAG = ''Y'' ENTONCES 1 OTRA 0) DE XAl agrupar filas, aplique "Si una fila es verdadera, entonces todas son verdaderas" lógica:
SELECCIONE MAX (BOOLEAN_FLAG) DESDE Y
Por el contrario, use MIN para forzar la agrupación falsa si una fila es falsa.
La mejor opción es 0 y 1 (como números; otra respuesta sugiere 0 y 1 como CHAR para la eficiencia del espacio, pero eso es un poco demasiado retorcido), usando NOT NULL y una restricción de verificación para limitar el contenido a esos valores. (Si necesita que la columna sea anulable, entonces no se trata de un booleano con el que se trata, sino de una enumeración con tres valores ...)
Ventajas de 0/1:
- Idioma independiente. ''Y'' y ''N'' estarían bien si todos lo usaran. Pero ellos no. En Francia usan ''O'' y ''N'' (he visto esto con mis propios ojos). No he programado en Finlandia para ver si usan ''E'' y ''K'' allí; sin duda son más inteligentes que eso, pero no se puede estar seguro.
- Congruente con la práctica en lenguajes de programación ampliamente utilizados (C, C ++, Perl, Javascript)
- Se reproduce mejor con la capa de aplicación, p. Ej. Hibernate
- Lleva a SQL más sucinto, por ejemplo, para averiguar cuántos plátanos están listos para comer
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'':
- Toma menos espacio que 0/1
- Es lo que sugiere Oracle, por lo que algunas personas están más acostumbradas a
Otro cartel sugirió ''Y'' / null para ganancias de rendimiento. Si ha demostrado que necesita el rendimiento, entonces es suficiente, pero evítelo ya que hace que las consultas sean menos naturales ( some_column is null
lugar de some_column = 0
) y en una combinación a la izquierda combinará falseness con registros inexistentes.
Oracle mismo usa Y / N para valores booleanos. Para completar, debe tenerse en cuenta que pl / sql tiene un tipo booleano, solo las tablas que no lo hacen.
Si está utilizando el campo para indicar si el registro debe procesarse o no, puede considerar usar Y y NULL como valores. Esto lo convierte en un índice muy pequeño (de lectura rápida) que ocupa muy poco espacio.
Para usar la menor cantidad de espacio, debe usar un campo CHAR restringido a ''S'' o ''N''. Oracle no es compatible con los tipos de datos BOOLEAN, BIT o TINYINT, por lo que el byte de CHAR es tan pequeño como se puede obtener.
Un ejemplo de trabajo para implementar la respuesta aceptada al agregar una columna "booleana" a una tabla existente en una base de datos de Oracle (usando el tipo 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))
);
Esto crea una nueva columna en my_table_name
llamada my_new_boolean_column
con valores predeterminados de 0. La columna no aceptará valores NULL
y restringe los valores aceptados a 0
o 1
.
Ya sea 1/0 o Y / N con una restricción de verificación en él. el éter está bien. Personalmente prefiero 1/0 ya que trabajo mucho en Perl, y hace que sea muy fácil hacer operaciones booleanas en campos de base de datos.
Si quieres una discusión realmente profunda de esta pregunta con uno de los jefes de cabeza de Oracles, mira lo que Tom Kyte dice sobre esto.