@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.
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.
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
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).
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.
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 typeIF error_flag THENUPDATE table_a SET id=8WHERE id =1;ENDIF;END;
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.
int
s). 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 aSELECT
), ya que es absolutamente apropiado devolver un valor booleano como resultado calculado a veces incluso dado el resto del argumento.DATE
tipo. Imagine tener que lidiar con representaciones de fechas todo el tiempo :)Respuestas:
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 aNUMBER(1) 0/1
cuando 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
''=NULL
estupidez.fuente
N
y loF
usé, porqueON
yOFF
empiezo con la misma letra ...No
Puedo usar:
--- disfruta Oracle
O use char Y / N como se describe aquí
fuente
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: 89
y ese NÚMERO:Typ=2 Len=2: 193,2
Al menos en 12c, el NÚMERO (1) puede usar 2 bytes ...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:
Espero que esto ayude a alguien.
fuente
boolean intToBool(int in) { return (in != 0); }
ColumnName = 0
oColumnName = 1
, en lugar deColumnName = 0
oColumnName <> 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.No en el nivel de SQL y es una pena. Sin embargo, hay uno en PLSQL
fuente
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:
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
fuente
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).
fuente
Hay un tipo booleano para usar en pl / sql , pero ninguno que se pueda usar como tipo de datos de una columna.
fuente
Un truco común para ahorrar espacio es almacenar valores booleanos como Oracle CHAR , en lugar de NUMBER:
fuente
Solo porque nadie lo mencionó todavía: usar RAW (1) también parece una práctica común.
fuente
fuente