GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Select Banco Oracle não produz resultado?

programação
oracle
banco
Tags: #<Tag:0x00007f39a3434b38> #<Tag:0x00007f39a34349d0> #<Tag:0x00007f39a3434840>

#1

Ao tentar fazer um select com uma condição, não retorna o resultado:

e meu comando SQL:

SELECT liv_preco FROM livro WHERE liv_preco > 50 AND ass_sigla like'%BAN%';

Meus dados na tabela livro são.


#2

no seu select você pede para retornar o registro em que LIV_PRECO seja maior que 50 E ASS_SIGLA como “BAN”.

Na imagem está claro que o único registro acima de 50 tem ASS_SIGLA diferente de “BAN”.

Se você espera que retornem os três registros (dois com ASS_SIGLA como “BAN” e LIV_PRECO maior que 50, troque o AND por OR


#3

Observando o select e os dados no banco, posso afirmar, com toda a certeza, que o resultado da consulta está correto.
Diferente de outros bancos (como o mysql, por exemplo), o oracle segue uma linha, digamos assim, mais ortodoxa e considera que '%BAN%' não inclui coisas como 'banco de dados para web', mesmo que haja a combinação das letras requeridas.
O que acontece é que, por alguma razão, a cláusula like, no oracle, é case sensitive.
Ou seja, se você alterar tua query para SELECT liv_preco FROM livro WHERE liv_preco > 50 AND UPPER(ass_sigla) like'%BAN%'; muito provavelmente terá mais êxito.
Lembre-se, o teu select deve ser sempre coerente com o que você está buscando.
P.S.: Não lembro se o oracle aceita o ILIKE e nem qual seu comportamento neste caso.


#4

verdade não tinha percebido


#5

quando coloco essa outra condição ele não traz nenhum resultado.

SELECT liv_preco,ass_sigla FROM livro WHERE liv_preco>50 OR upper(ass_sigla) like'P%';

#6

sendo que existe um registro que se encaixe nessa condição


#7

Tenta assim:

SELECT liv_preco,ass_sigla FROM livro WHERE liv_preco>50 or upper(ass_sigla) like UPPER('P%');`

#8

man ele apresentou o mesmo resultado


#9

Quando coloco essa condição ele não traz nenhum resultado poderia me ajudar.

 SELECT liv_preco,ass_sigla FROM livro WHERE liv_preco > 50 or upper(ass_sigla) like'P%';

e tentei dessa forma

SELECT liv_preco,ass_sigla FROM livro WHERE liv_preco > 50 or upper(ass_sigla) like UPPER('P%');

Mas nenhuma deu certo


#10

Teoricamente, o operador or deveria trazer tudo que combine com uma das cláusulas ou com a outra. Se fizer elas separadas?


#11

como assim separadas


#12

Isso

SELECT liv_preco,ass_sigla FROM livro WHERE liv_preco > 50 or upper(ass_sigla) like UPPER('P%');

É o mesmo que isso

SELECT liv_preco,ass_sigla FROM livro WHERE liv_preco > 50
UNION
SELECT liv_preco,ass_sigla FROM livro WHERE upper(ass_sigla) like UPPER('P%');

Como pode ver, são duas queries unidas em uma, pelo operador OR, o que, grosseiramente, indica que você quer qualquer resultado onde o valor de liv_preco seja maior que 50 (apenas os maiores que 50, iguais ou menores não servem) ou onde o valor de ass_sigla seja iniciado em P e tenha qualquer coisa após isso.
Você pode executá-las isoladamente e ver qual delas não está atendendo aos critérios desejados:

SELECT liv_preco,ass_sigla FROM livro WHERE liv_preco > 50

E depois

SELECT liv_preco,ass_sigla FROM livro WHERE upper(ass_sigla) like UPPER('P%');

Assim você consegue ver se ambas trazem resultados ou se alguma delas falha.


#13

É importante ressaltar, também, o seguinte: a query que você criou utiliza-se do operador OR, que é a representação do operador lógico OR, cuja funcionalidade se baseia em sempre procurar uma condição verdadeira numa expressão lógica. A tabela-verdade deste operador é:

Condição 1 Condição 2 Resultado
V          V          V
V          F          V
F          V          V
F          F          F

Ou seja, a única possibilidade para que nenhum resultado seja obtido na query é que as duas condições sejam falsas, o que significa que nem a primeira condição (liv_preco > 50) e nem a segunda (upper(ass_sigla) like upper(‘P%’)) possuem correspondentes


#14

Use um collatation que seja case insensitive. Usar UPPER deve funcionar em vários casos mas é meio que um chuncho, e se o collatation do campo estiver “errado” pode até ser que acentos não sejam tratados como você esperaria, por exemplo.


#15

@Kronal, neste caso em específico, nenhum dos valores presentes na coluna ass_sigla possui acento, logo, o UPPER deveria funcionar, não?


#16

To vendo pelo menos um acento ali! rs Mas o jeito correto é usar um collation insensitive, não tem porque não fazer isso. OP ainda poderia ter mudado o tipo do collation da própria coluna para nem sequer precisar usar UPPER nem conversão usando COLLATE, caso esse tipo de busca seja comum.


#17

@Kronal, estamos falando de uma pessoa que, pelo que percebo, está começando com banco de dados. Creio que o que ele fez foi criar a tabela e começar a testar o CRUD quando encontrou dificuldades.
Tudo o que está na tabela deve ter pego as configurações padrão. Estas configurações podem mudar de coluna para coluna?
Os valores da coluna ass_sigla não tem acentos. Só os valores da coluna LIV_TITULO que estão acentuados.


#18

Ah sim, desculpa olhei a coluna errada.

Por isso era bom já ser introduzido ao fato de que strings tem ordenação e igualdade que depende do “idioma” que foi definido para eles, em lugar de apresentar uma solução que depois vai trazer problemas.

Sem contar que mandar usar UPPER falha em esclarecer o motivo dele ter falhado, que não é obvio, e o motivo se deve ao fato de que a comparação está sendo feita de forma case-sensitive é devido ao collation da coluna. É simplesmente errado dizer que tudo é case-sensitive como você fez aqui:

Isso além de ser errado, BAN pode ou não fazer match só depende do collation usado, isso não é particular do Oracle, outros SGBDs também tem suporte a collations.


#19

Não estou questionando o uso ou a aplicação de collations.
O que estou dizendo é que, como iniciante, ele pode nem imaginar o que é isso, se usa colher ou garfo para comer, entendeu?
Aliás, a maioria dos desenvolvedores vai precisar apenas dos dados de conexão e do que precisa ser feito. Dificilmente eles vão parar suas atividades para focar em qual collation o banco usa.
Isso, com certeza, é uma das tarefas do DBA. Talvez um desenvolvedor PL/SQL vá se atentar a isso também.
Eu discordo do que disse sobre ele ser iniciante e que ele deveria ser introduzido a isso ou aquilo. O aprendizado é gradual. Neste momento o importante é saber como funciona. Depois devem vir as particularidades.


#20

E por isso explicar errado não adianta, a explicação é: collations. Use uma que seja CI.

É sim, assim como também deveria ser conhecimento de quem escreve SQL.

Enfim você acha que vale a pena simplificar ao ponto de desinformar o cara e deu uma solução que resolve, não tem muito mais que discutir…

Se é resolver por resolver eu também dei a solução e ele pode usar sem entender porque, exceto que não tentei dar uma explicação errada pra ele. Que é acho que é sim um problema.