Ontem, eu queria adicionar um campo booleano a uma tabela Oracle. No entanto, não há realmente um tipo de dados booleano no Oracle. Alguém aqui sabe a melhor maneira de simular um booleano? Pesquisando no assunto, descobrimos várias abordagens
Use um número inteiro e não se preocupe em atribuir nada além de 0 ou 1 a ele.
Use um campo char com 'Y' ou 'N' como os únicos dois valores.
Use uma enumeração com a restrição CHECK.
Os desenvolvedores Oracle experientes sabem qual abordagem é preferida / canônica?
oracle
boolean
sqldatatypes
Eli Courtwright
fonte
fonte
wall
tipo de dados para poder esmagar minha cabeça ao usar booleanos.Respostas:
Achei este link útil.
Aqui está o parágrafo destacando alguns dos prós / contras de cada abordagem.
Basicamente, eles defendem o método número 2, por uma questão de eficiência, usando
getBoolean()
etc.) com uma restrição de verificaçãoO exemplo deles:
fonte
O próprio Oracle usa Y / N para valores booleanos. Para completar, deve-se notar que o pl / sql tem um tipo booleano, são apenas as tabelas que não.
Se você estiver usando o campo para indicar se o registro precisa ser processado ou não, considere usar Y e NULL como valores. Isso cria um índice muito pequeno (leia rapidamente) que ocupa muito pouco espaço.
fonte
Para usar a menor quantidade de espaço, você deve usar um campo CHAR restrito a 'Y' ou 'N'. O Oracle não suporta os tipos de dados BOOLEAN, BIT ou TINYINT, portanto, um byte de CHAR é o menor possível.
fonte
A melhor opção é 0 e 1 (como números - outra resposta sugere 0 e 1 como CHAR para eficiência de espaço, mas isso é um pouco distorcido para mim), usando NOT NULL e uma restrição de verificação para limitar o conteúdo a esses valores. (Se você precisa que a coluna seja anulável, não é um booleano com o qual você está lidando, mas uma enumeração com três valores ...)
Vantagens de 0/1:
select sum(is_ripe) from bananas
vez deselect count(*) from bananas where is_ripe = 'Y'
ou mesmo (yuk)select sum(case is_ripe when 'Y' then 1 else 0) from bananas
Vantagens de 'Y' / 'N':
Outro pôster sugeria 'Y' / nulo para ganhos de desempenho. Se você provou que precisa do desempenho, é justo o suficiente, mas evite, pois isso torna a consulta menos natural (em
some_column is null
vez desome_column = 0
) e em uma junção esquerda, você confundirá a falsidade com registros inexistentes.fonte
1/0 ou Y / N com uma restrição de verificação. éter é bom. Pessoalmente, prefiro 1/0, pois faço muito trabalho em perl, e isso facilita muito a operação booleana de perl nos campos do banco de dados.
Se você quiser uma discussão realmente aprofundada dessa questão com um dos honchos do Oracles, confira o que Tom Kyte tem a dizer sobre isso. Aqui
fonte
O banco de dados em que fiz a maior parte do meu trabalho usou 'Y' / 'N' como booleanos. Com essa implementação, você pode executar alguns truques como:
Contar linhas verdadeiras:
SELECT SUM (CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0 0) FROM X
Ao agrupar linhas, aplique a lógica "Se uma linha for verdadeira, todas serão verdadeiras":
SELECT MAX (BOOLEAN_FLAG) FROM Y
Por outro lado, use MIN para forçar o agrupamento false se uma linha for falsa.
fonte
Um exemplo de trabalho para implementar a resposta aceita adicionando uma coluna "Boolean" a uma tabela existente em um banco de dados oracle (usando o
number
tipo):Isso cria uma nova coluna
my_table_name
chamadamy_new_boolean_column
com valores padrão de 0. A coluna não aceitaNULL
valores e restringe os valores aceitos a0
ou1
.fonte
Em nossos bancos de dados, usamos uma enumeração que garante que passamos TRUE ou FALSE. Se você fizer uma das duas primeiras maneiras, é muito fácil começar a adicionar novo significado ao número inteiro sem passar por um design adequado ou terminar com esse campo char com Y, y, N, n, T, t, Valores F, f e ter que lembrar qual seção do código usa qual tabela e qual versão de true está usando.
fonte