142 votos

Campo booleano en Oracle

Ayer quise añadir un campo booleano a una mesa del Oracle. Sin embargo, en realidad no hay un tipo de datos booleano en el Oracle. ¿Alguien de aquí sabe cuál es la mejor manera de simular un booleano? Al buscar en Google el tema se descubrieron varios enfoques

  1. Usa un número entero y no te molestes en asignarle nada más que 0 o 1.

  2. Use un campo de caracteres con "Y" o "N" como los únicos dos valores.

  3. Use una lista con la restricción CHECK.

¿Saben los desarrolladores experimentados de Oracle qué enfoque es el preferido/canónico?

80voto

ColinYounger Puntos 2941

Encontré este enlace útil.

Básicamente abogan por el método número 2, por razones de eficiencia, es decir.

create table tbool (bool char check (bool in ('N','Y'));


Versión de archivo web: http://web.archive.org/web/20100529164819/http://articles.techrepublic.com.com/5100-10878_11-5229553.html

28voto

Leigh Riffel Puntos 2550

El propio Oráculo utiliza S/N para los valores booleanos. Para completar, hay que tener en cuenta que pl/sql tiene un tipo booleano, sólo las tablas no lo tienen.

Si utiliza el campo para indicar si el registro debe ser procesado o no, podría considerar la posibilidad de utilizar Y y NULL como valores. Esto hace que el índice sea muy pequeño (de lectura rápida) y que ocupe muy poco espacio.

26voto

Bill the Lizard Puntos 147311

Para usar la menor cantidad de espacio debes usar un campo CHAR restringido a "Y" o "N". Oracle no soporta los tipos de datos BOOLEAN, BIT o TINYINT, así que el byte CHAR es el más pequeño que se puede obtener.

19voto

Andrew Spencer Puntos 1870

La mejor opción es el 0 y el 1 (como números), usando NOT NULL y una restricción de verificación para limitar los contenidos a esos valores. (Si necesitas que la columna sea nula, entonces no se trata de una booleana sino de una enumeración con tres valores...)

Ventajas del 0/1:

  • Independiente del idioma. La 'Y' y la 'N' estarían bien si todos la usaran. Pero no lo hacen. En Francia usan la 'O' y la 'N' (lo he visto con mis propios ojos). Supongo que los finlandeses no son tan tontos como para usar 'E' y 'K', pero yo no apostaría demasiado por ello.
  • Congruente con la práctica en los lenguajes de programación ampliamente utilizados (C, C++, Perl, Javascript)
  • Juega mejor con la capa de aplicación, por ejemplo, Hibernar
  • Lleva a un SQL más sucinto, por ejemplo, para averiguar cuántos plátanos están listos para comer select sum(is_ripe) from bananas en lugar de select count(*) from bananas where is_ripe = 'Y' o incluso (yuk) select sum(case is_ripe when 'Y' then 1 else 0) from bananas

Ventajas del 'Y'/'N':

  • Ocupa menos espacio que 0/1
  • Es lo que sugiere el Oráculo, así que podría ser lo que algunas personas están más acostumbradas a

Otro póster sugería 'Y'/null para mejorar el rendimiento. Si usted ha probado que necesita la actuación, entonces es justo, pero por lo demás evítelo ya que hace que la consulta sea menos natural ( some_column is null en lugar de some_column = 0 ) y en una unión a la izquierda mezclarás la falsedad con los registros inexistentes.

5voto

Matthew Watson Puntos 7762

O bien 1/0 o S/N con una restricción de control. El otro modo está bien. Personalmente prefiero 1/0 ya que hago mucho trabajo en Perl, y hace muy fácil hacer operaciones booleanas de Perl en los campos de la base de datos.

Si quieres una discusión a fondo de esta cuestión con uno de los jefes de los Oráculos, mira lo que Tom Kyte tiene que decir al respecto. Aquí

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X