¿Hay algún tipo booleano en las bases de datos Oracle?

250

¿Hay algún tipo booleano en las bases de datos Oracle, similar al BITtipo de datos en MS SQL Server?

Peder
fuente
77
Desafortunadamente, Oracle no es totalmente compatible con el estándar ANSI SQL: 1999 ( en.wikipedia.org/wiki/SQL:1999 ) cuando se introdujo.
Jeffrey Kemp
2
Punto de vista alternativo (por qué SQL no debería tener un tipo booleano): vadimtropashko.wordpress.com/2010/09/16/…
Jeffrey Kemp
77
@JeffreyKemp Ese blog no tiene sentido. El hecho de que algunos valores booleanos se puedan calcular en función de otros campos en una tabla, no significa que se puedan calcular todos los campos booleanos. Por ejemplo, "is_trusted_customer", donde esto es cierto si y solo si un humano decide: "Confío en esa persona".
Jacob
2
@JeffreyKemp Felicitaciones, acabas de reinventar los booleanos de estilo C (donde estás usando ints). Definitivamente deberíamos volver a los del código. Además, el argumento se desmorona por completo si se comparten los tipos de datos entre las columnas de la tabla y las columnas de resultados (de a SELECT), ya que es absolutamente apropiado devolver un valor booleano como resultado calculado a veces incluso dado el resto del argumento.
jpmc26
2
Si. Más tipos de datos, como los booleanos, darían un poder expresivo más exacto: no recibiré ningún argumento de mi parte en ese frente. Me alegro de que al menos tengamos un DATEtipo. Imagine tener que lidiar con representaciones de fechas todo el tiempo :)
Jeffrey Kemp

Respuestas:

278

No solo falta el tipo de datos booleano en el SQL de Oracle (no PL / SQL), sino que tampoco tienen una recomendación clara sobre qué usar. Ver este hilo en asktom. Desde recomendar CHAR(1) 'Y'/'N', cambian a NUMBER(1) 0/1cuando alguien señala que 'Y'/'N'depende del idioma inglés, mientras que, por ejemplo, los programadores alemanes podrían usarlo 'J'/'N'.

Lo peor es que defienden esta estúpida decisión al igual que defienden la ''=NULLestupidez.

Erich Kitzmueller
fuente
99
1/0 es, si no ambiguo, al menos menos ambiguo.
Adam Musch
15
Pero '' = NULL es falso! '' IS NULL es cierto. :)
Jim Davis
44
Michael-O: Lo he visto varias veces. Para mí, es 0/1 todo el tiempo, pero otros programadores prefieren J / N. (Vivo en un país de habla alemana)
Erich Kitzmueller
11
@Irfy Recientemente, lo vi Ny lo Fusé, porque ONy OFFempiezo con la misma letra ...
JimmyB
77
uno podría argumentar que como reemplazo de un booleano, 'T' / 'F' tiene aún más sentido
Erich Kitzmueller
55

No

Puedo usar:

IS_COOL NUMBER(1,0)

1 - true
0 - false

--- disfruta Oracle

O use char Y / N como se describe aquí

Bohdan
fuente
66
Prefiero char (1) porque usa menos espacio. Puede verificarlo de esta manera: create table testbool (boolc char(1), booln number(1)); insert into testbool values ('Y', 1 ); select dump(boolc), dump(booln) from testbool; ese CHAR está almacenado: Typ=96 Len=1: 89y ese NÚMERO: Typ=2 Len=2: 193,2Al menos en 12c, el NÚMERO (1) puede usar 2 bytes ...
phil_w
38

Según las respuestas de Ammoq y kupa, utilizamos el número (1) con un valor predeterminado de 0 y no permitimos valores nulos.

Aquí hay una columna de agregar para demostrar:

ALTER TABLE YourSchema.YourTable ADD (ColumnName NUMBER(1) DEFAULT 0 NOT NULL);

Espero que esto ayude a alguien.

Alex Stephens
fuente
17
Tenga en cuenta que también puede almacenar -1 allí. Puede agregar una restricción de verificación para limitar los valores a 0 y 1.
David Aldridge
@DavidAldridge En la lógica booleana, cualquier número que no sea 0 (FALSO) es equivalente a 1 (VERDADERO), por lo que no importa qué número esté almacenado, anulando la necesidad de una restricción de verificación. Agregar una función que devuelve un booleano desde un int es trivial:boolean intToBool(int in) { return (in != 0); }
Agi Hammerthief
3
@AgiHammerthief Verdadero, pero si desea encontrar filas utilizando un predicado en la columna "booleana", preferiría saber que mis opciones son ColumnName = 0o ColumnName = 1, en lugar de ColumnName = 0o ColumnName <> 0. La semántica de la última no es amigable para los programadores. También me gustaría mantenerlo más simple para el optimizador de consultas al tener dos valores.
David Aldridge
14

No en el nivel de SQL y es una pena. Sin embargo, hay uno en PLSQL

vc 74
fuente
13

No, no hay un tipo booleano en Oracle Database, pero puede hacerlo de esta manera:

Puede poner una restricción de verificación en una columna.

Si su tabla no tiene una columna de verificación, puede agregarla:

ALTER TABLE table_name
ADD column_name_check char(1) DEFAULT '1';

Cuando agrega un registro, por defecto esta columna obtiene 1.

Aquí pones una marca que limita el valor de la columna, solo pon 1 o 0

ALTER TABLE table_name ADD
CONSTRAINT name_constraint 
column_name_check (ONOFF in ( '1', '0' ));
Roberto Góes
fuente
9

No, no existe el tipo booleano, pero en lugar de esto puede usted 1/0 (número de tipo), o 'Y' / 'N' (tipo char), o 'verdadero' / 'falso' (tipo varchar2).

kupa
fuente
4

Un truco común para ahorrar espacio es almacenar valores booleanos como Oracle CHAR , en lugar de NUMBER:

Pranay Rana
fuente
44
CHAR (1) y VARCHAR2 (1) son idénticos en el uso del espacio.
Tony Andrews
3
Como aprendí aquí docs.oracle.com/cd/E17952_01/refman-5.5-en/char.html cuando contamos un char, existe una diferencia solo entre char y varchar: char usa 1 byte, pero varchar usa 1 byte para el espacio vacío + 1 byte para un carácter -> varchar (varchar2) usa 2 bytes para 1 carácter <cuando char usa solo 1 byte
Artem.Borysov
@ Artem.Borysov: ese manual es para MySQL, no para la base de datos Oracle
a_horse_with_no_name
3

Solo porque nadie lo mencionó todavía: usar RAW (1) también parece una práctica común.

Filburt
fuente
1
raw (1) es genial, ya que el usuario no puede asumir lo que contiene, la persona que realiza la consulta tiene que entender lo que está en la columna raw (1) y traducirlo en algo significativo.
Jacob
13
<sarcasm> Sí, es tan genial que no puedes escribir código jdbc portátil con él. </sarcasm>
chubbsondubs
@jacob - <sarcasm> ¡Esa es una idea increíble! ¡Debemos deshacernos de todos los demás tipos de datos y almacenar todo en columnas RAW! ¡Entonces NADIE podría malinterpretar arbitrariamente los datos! </sarcasm>
Bob Jarvis - Restablece a Mónica el
Imagínese si en Oracle hubiera alguna forma de definir tipos de datos para poder crear un tipo bool que envuelva el tipo 'raw (1)' nombrándolo bool o boolean. Entonces podríamos definir una función para imprimir 'verdadero' o 'falso' dependiendo del contenido.
Jacob
-1
DECLARE
error_flag  BOOLEAN := false;
BEGIN

error_flag := true;
--error_flag := 13;--expression is of wrong type

  IF error_flag THEN 

UPDATE table_a SET id= 8 WHERE id = 1;

END IF;
END;
zloctb
fuente
Este ejemplo funciona. También noté que solo puedo trabajar con tipos booleanos dentro de PL / SQL. Las llamadas booleanas dentro de SQL no lo hacen, y produce un error de operador relacional no válido.
Richard Pascual