Existe algum tipo booleano nos bancos de dados Oracle?

249

Existe algum tipo booleano nos bancos de dados Oracle, semelhante ao BITtipo de dados no Ms SQL Server?

Peder
fonte
7
Infelizmente, o Oracle não suporta totalmente o padrão ANSI SQL: 1999 ( en.wikipedia.org/wiki/SQL:1999 ) quando este foi introduzido.
Jeffrey Kemp
2
Ponto de vista alternativo (por que o SQL não deve ter um tipo booleano): vadimtropashko.wordpress.com/2010/09/16/…
Jeffrey Kemp
7
@JeffreyKemp Esse blog não faz sentido. Só porque alguns valores booleanos podem ser calculados com base em outros campos de uma tabela, não significa que todos os campos booleanos possam ser calculados. Por exemplo "is_trusted_customer", onde isso é verdade se, e somente se, um ser humano decide: "Confio nessa pessoa".
Jacob
2
@JeffreyKemp Parabéns, você acabou de reinventar os booleanos de estilo C (onde você está usando ints). Definitivamente, devemos voltar aos que estão no código. Além disso, o argumento desmorona completamente se os tipos de dados entre as colunas da tabela e as colunas de resultados (de a SELECT) são compartilhados, pois é absolutamente apropriado retornar um booleano como resultado computado, às vezes, mesmo com o restante do argumento.
Jpmc26
2
Sim. Mais tipos de dados, como booleanos, dariam um poder expressivo mais exato - você não terá argumentos meus nessa área. Eu sou nós apenas feliz por ter pelo menos um DATEtipo - imagine ter que lidar com representações de seqüência de datas o tempo todo :)
Jeffrey Kemp

Respostas:

277

Não apenas o tipo de dados booleano está ausente no SQL do Oracle (não PL / SQL), mas eles também não têm nenhuma recomendação clara sobre o que usar. Veja este tópico no asktom. De recomendar, CHAR(1) 'Y'/'N'eles mudam para NUMBER(1) 0/1quando alguém ressalta que 'Y'/'N'depende do idioma inglês, enquanto, por exemplo, programadores alemães podem usar 'J'/'N'.

O pior é que eles defendem essa decisão estúpida, assim como defendem a ''=NULLestupidez.

Erich Kitzmueller
fonte
9
1/0 é, se não ambíguo, pelo menos menos ambíguo.
Adam Musch
15
Mas '' = NULL é falso! '' IS NULL é verdadeiro. :)
Jim Davis
4
Michael-O: Eu já vi isso várias vezes. Para mim, é 0/1 o tempo todo, mas outros programadores preferem o J / N. (Eu vivo em um país de língua alemã)
Erich Kitzmueller
11
@Irfy Recentemente, eu vi Ne Fque está sendo usado, porque ONe OFFcomeçar com a mesma letra ...
JimmyB
7
pode-se argumentar que, como um substituto para um booleano, 'T' / 'F' faz ainda mais sentido
Erich Kitzmueller
55

Não.

Pode usar:

IS_COOL NUMBER(1,0)

1 - true
0 - false

--- aproveite o Oracle

Ou use char Y / N como descrito aqui

Bohdan
fonte
6
Eu prefiro char (1) porque ele usa menos espaço. Você pode verificá-lo desta maneira: create table testbool (boolc char(1), booln number(1)); insert into testbool values ('Y', 1 ); select dump(boolc), dump(booln) from testbool; Que CHAR é armazenado: Typ=96 Len=1: 89e esse número: Typ=2 Len=2: 193,2Pelo menos em 12c, NÚMERO (1) pode usar 2 bytes ...
phil_w
38

De acordo com as respostas da Ammoq e da kupa, usamos o número (1) com o padrão 0 e não permitimos nulos.

aqui está uma coluna de adição para demonstrar:

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

Espero que isso ajude alguém.

Alex Stephens
fonte
17
Observe que você pode armazenar -1 também. Você pode adicionar uma restrição de verificação de que para valores-limite a 0 e 1.
David Aldridge
@DavidAldridge Na lógica booleana, qualquer número que não seja 0 (FALSE) é equivalente a 1 (TRUE), portanto, não importa qual número seja armazenado, anulando a necessidade de uma restrição de verificação. Adicionar uma função que retorna um booleano de um int é trivial:boolean intToBool(int in) { return (in != 0); }
Agi Hammerthief
3
@AgiHammerthief True, mas se você quiser encontrar linhas usando um predicado na coluna "booleana", prefiro saber que minhas opções são ColumnName = 0or ColumnName = 1, em vez de ColumnName = 0or ColumnName <> 0. A semântica do último não é amigável para programadores. Eu também gostaria de simplificá-lo para o otimizador de consultas, tendo dois valores.
David Aldridge
14

Não no nível SQL e isso é uma pena. Mas há um no PLSQL

vc 74
fonte
13

Não, não há um tipo booleano no Oracle Database, mas você pode fazer o seguinte:

Você pode colocar uma restrição de verificação em uma coluna.

Se sua tabela não possui uma coluna de verificação, você pode adicioná-la:

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

Quando você adiciona um registro, por padrão, esta coluna recebe 1.

Aqui você coloca um cheque que limita o valor da coluna, apenas coloca 1 ou 0

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

Não existe o tipo booleano, mas, em vez disso, você pode 1/0 (número do tipo), 'Y' / 'N' (tipo char) ou 'true' / 'false' (tipo varchar2).

kupa
fonte
4

Um truque comum de economia de espaço é armazenar valores booleanos como um Oracle CHAR , em vez de NUMBER:

Pranay Rana
fonte
4
CHAR (1) e VARCHAR2 (1) são idênticos no uso do espaço.
Tony Andrews
3
Como aprendi aqui, docs.oracle.com/cd/E17952_01/refman-5.5-en/char.html quando descrevemos um caractere, existe diferença apenas entre char e varchar - char usa 1 byte, mas varchar usa 1 byte para espaço vazio + 1 byte para um caractere -> varchar (varchar2) usa 2 bytes para 1 caractere <quando char usa apenas 1 byte
Artem.Borysov
@ Artem.Borysov: esse manual é para MySQL, não para o banco de dados Oracle
a_horse_with_no_name
3

Só porque ninguém mencionou ainda: o uso do RAW (1) também parece uma prática comum.

Filburt
fonte
1
O raw (1) é ótimo, pois o usuário não pode assumir o que está nele, a pessoa que faz a consulta precisa entender o que está na coluna raw (1) e traduzi-lo para algo significativo.
Jacob
13
<sarcasm> Sim, é tão grande que você não pode escrever código jdbc portátil com ele </ sarcasmo>.
chubbsondubs
@jacob - <sarcasm> Essa é uma ideia incrível! Devemos nos livrar de todos os outros tipos de dados e armazenar tudo nas colunas RAW! NINGUÉM poderia arbitrariamente interpretar mal os dados! </sarcasm>
Bob Jarvis - Restabelece Monica
Imagine se houvesse alguma maneira no oracle de definir tipos de dados para que pudéssemos criar um tipo bool que envolva o tipo 'raw (1)', nomeando-o como booleano ou booleano. Poderíamos então definir uma função para imprimir 'true' ou 'false', dependendo do conteúdo.
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
fonte
Este exemplo funciona. Notei também que só posso trabalhar com tipos booleanos no PL / SQL. Chamadas booleanas no SQL não produzem e produz um erro inválido de operador relacional.
Richard Pascual