Trazendo linhas a mais?

Trazendo linhas a mais?
Guilherme Silveira
Guilherme Silveira

Compartilhe

Query bonita escrita, executada, resultado zoado.

Gostaria de trazer os livros ativos cujos preços tem algo de estranho: são muito baratos (< 10) OU muito caros (> 1000)


select * from Livros where ativo = true AND preco < 10 OR preco > 1000;

\> Java SE 8 Programmer I, true, 5 > Swift, true, 3000 > Introdução a Computação, false, 2000

Que caca! O espertinho trouxe um livro que está inativo. Mas eu pedi ativo, não pedi? Pedi ativo, sim:


where ativo = true

O que aconteceu? Opa! Como já dizia meu pai, "e ou" não é a mesma coisa que "ou e". Vamos ver? Troco a ordem do nosso AND OR por OR AND:


select * from Livros where preco < 10 OR preco > 1000 AND ativo = true;

\> Java SE 8 Programmer I, true, 5 > Swift, true, 3000 > Algortimos, false, 37

Opa lá! Não é mesmo! Para com isso!

Acontece que como em qualquer linguagem, SQL também segue padrões de precedência de operadores. Se quer forçar sua própria ordem, diga aos SQL como diria a sua professora de matemática: use parênteses.


select * from Livros where (preco < 10 OR preco > 1000) AND ativo = true;

\> Java SE 8 Programmer I, true, 5 > Swift, true, 3000

A sacada? Sempre que escrever uma regra que envolva um OR, utilize parentêses.

Gostou das boas práticas? recomende a lista para um amigo!

Desafio para a próxima: devo criar lógica de negócios complexa no banco? Quando usar a tal da stored procedure?

Guilherme Silveira
Guilherme Silveira

Co-fundador da Alura, da Caelum e do GUJ. Com 18 anos de ensino nas áreas de programação e dados, criou mais de 100 cursos. Possui formação em engenharia de software, viés matemático e criativo, além de ser medalhista de ouro em competições nacionais de computação, tendo representado o Brasil nos mundiais. Participante de comunidades open source e de educação em tecnologia, tendo escrito 7 livros. Faz mágica e fala coreano no tempo livre.

Veja outros artigos sobre DevOps