Artigos de Tecnologia e Negócios

Trazendo linhas a mais?

Guilherme Silveira
Guilherme Silveira

Query bonita escrita, executada, resultado zoado. Quem nunca teve uma query respondendo um monte de coisa que não foi pedido?

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?

Artigos de Tecnologia e Negócios