AND y OR ejemplos para entender el funcionamiento

Iniciado por gAb1, 26 Noviembre 2015, 15:43 PM

0 Miembros y 1 Visitante están viendo este tema.

gAb1

Estoy tratando de filtrar resultados usando 3 columnas como filtros pero no funciona como me esperaba...

Por ejemplo, en la tabla tengo un solo ejemplo: col1 es 2, col2 es 0 y col3 es 3.

Si hago:

Código (sql) [Seleccionar]
AND col1 = 1 OR col1 = 3
AND col3 = 3


No se muestra el ejemplo. Pero si hago:

Código (sql) [Seleccionar]
AND col1 = 1 OR col1 = 3
AND col3 = 1 OR col3 = 3


Si que se muestra... ¿por qué ahora si pero antes no? No le veo ningún sentido... No hay ninguna col3 con valor 1 pero si con 3, ¿por qué no se muestra cuando solo busco el valor 3? Pero si busco el valor 1 y 3 ¿si que se muestra? Por favor explicarmelo o me volveré más loco aun  :-\

Si cualquiera de los AND no se cumple (no se muestra nada) o como funciona exactamente?

¿Funcionará igual si uso IN() en lugar de OR? Mejor cuando lo entienda uso el IN().

Gracias!

Carloswaldo

Creo que lo primero que tienes que empezar haciendo es aprender un poco de lógica matemática. Acá se manejan valores de Verdadero y Falso, y los operadores lógicos como AND y OR toman 2 valores y realizan una operación sobre ellos. Tal como 2 + 2 = 4, puedes tener operaciones T and T = T. Lo bueno es que los valores binarios solo son 2 y puedes tener una tabla de los resultados porque son solo unos cuantos.

AND se cumple solo cuando ambos valores son verdaderos:

T and T = T
T and F = F
F and T = F
F and F = F

OR se cumple cuando al menos uno de los valores es verdadero:

T or T = T
T or F = T
F or T = T
F or F = F

en tus ejemplos tienes un AND al principio pero no sabemos qué es lo que hay antes de ese AND, ni si es verdadero o falso.

Otra cosa que tienes que tener en cuenta al usar varios operadores lógicos es que para mejor lectura debes agruparlos con paréntesis. Claro que si no usas paréntesis los operadores tienen un orden de resolución, pero es mejor que sea legible.

Links:

http://www.sc.ehu.es/sbweb/fisica/cursoJava/fundamentos/introduccion/operadores1.htm
http://www.bennadel.com/blog/126-sql-and-or-order-of-operations.htm

gAb1

No sé que tipo de lógica matemática lleva el OR (sin paréntesis), pero con IN() funciona exactamente como quiero:

Por ejemplo (tomando en cuenta el ejemplo: type es 2, status es 0 y bhk es 3)

Código (sql) [Seleccionar]
AND t2.type = 1 OR t2.type = 2
AND t2.status = 0 --OR t2.status = 1
AND t2.bhk = 1


No devuelve nada, pero si le añado el OR si que devuelve, ¿qué tipo de lógica es esa?

Si hacemos lo mismo pero con IN() funciona perfectamente:

Código (sql) [Seleccionar]
AND t2.type IN (1, 2)
AND t2.status IN (0) -- (0, 1)
AND t2.bhk IN (1)


No devuelve nada, ni con 0 solo, ni con 0 y 1... Esto si lo veo lógico.

Para que devuelva con el IN:

Código (sql) [Seleccionar]
AND t2.type IN (1,2)  -- 2
AND t2.status IN (0)  -- 0
AND t2.bhk IN (1,3)  -- 3


Ahora devuelve el ejemplo porque todos los AND son TRUE. Esto es lo que necesitaba.

Exacto, acaba de leer que necesito parentesis para que el OR haga lo que necesito, pero es más facil usar IN.

Gracias!