@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.
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.
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
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.
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 typeIF error_flag THENUPDATE table_a SET id=8WHERE id =1;ENDIF;END;
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.
int
s). 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 aSELECT
) são compartilhados, pois é absolutamente apropriado retornar um booleano como resultado computado, às vezes, mesmo com o restante do argumento.DATE
tipo - imagine ter que lidar com representações de seqüência de datas o tempo todo :)Respostas:
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 paraNUMBER(1) 0/1
quando 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
''=NULL
estupidez.fonte
N
eF
que está sendo usado, porqueON
eOFF
começar com a mesma letra ...Não.
Pode usar:
--- aproveite o Oracle
Ou use char Y / N como descrito aqui
fonte
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: 89
e esse número:Typ=2 Len=2: 193,2
Pelo menos em 12c, NÚMERO (1) pode usar 2 bytes ...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:
Espero que isso ajude alguém.
fonte
boolean intToBool(int in) { return (in != 0); }
ColumnName = 0
orColumnName = 1
, em vez deColumnName = 0
orColumnName <> 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.Não no nível SQL e isso é uma pena. Mas há um no PLSQL
fonte
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:
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
fonte
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).
fonte
Há um tipo booleano para uso em pl / sql , mas nenhum que pode ser usado como o tipo de dados de uma coluna.
fonte
Um truque comum de economia de espaço é armazenar valores booleanos como um Oracle CHAR , em vez de NUMBER:
fonte
Só porque ninguém mencionou ainda: o uso do RAW (1) também parece uma prática comum.
fonte
fonte