La cláusula WHERE del SELECT nos permite poner condiciones o sea filtrar los datos que obtendremos como resultado.
¿Cómo funciona la cláusula WHERE?
Mediante una comparación.
Cuando comparamos una cosa con otra cosa el resultado de esa comparación solamente puede ser verdadero o falso, no existe otra posibilidad.
Ejemplos:
CLI_CODIGO IS NULL -- ¿El código del cliente es NULL? CLI_CODIGO IS NOT NULL --¿El código del cliente no es NULL? EXTRACT(YEAR FROM ALU_FECING) = 2016 -- ¿El año en que ingresó el alumno es 2016? PRD_PREVTA >10000 -- ¿El precio de venta del producto es mayor que 10000? PRO_NOMBRE LIKE 'J%' -- ¿El nombre del profesor empieza con la letra Jota?
Como ves, en todas las condiciones anteriores la respuesta puede ser afirmativa (verdadera) o negativa (falsa). No existe otra posibilidad.
Al usar un CASE en la cláusula WHERE de un SELECT debemos tener en cuenta ese punto. Siempre debemos comparar lo que devuelve el CASE con algo.
Listado 1.
SELECT * FROM PERSONAS WHERE CASE WHEN PER_SEXOXX = 1 THEN 'F' WHEN PER_SEXOXX = 2 THEN 'M' END = 'F'
Aquí el CASE solamente nos puede devolver una letra ‘F’ o una letra ‘M’, no hay otra posibilidad. Y comparamos lo que nos devolvió con la letra ‘F’ (eso es lo que hacemos después del END).
En otras palabras, la cláusula WHERE podría ser:
WHERE ‘F’ = ‘F’
o podría ser:
WHERE ‘M’ = ‘F’
¿Y qué haríamos si la columna PER_SEXOXX puede contener NULL?
Listado 2.
SELECT * FROM PERSONAS WHERE CASE WHEN PER_SEXOXX = 1 THEN 'F' WHEN PER_SEXOXX = 2 THEN 'M' ELSE 'X' END = 'F'
O sea que la cláusula WHERE devolverá una letra ‘X’ si la columna PER_SEXOXX es distinta de 1 y es distinta de 2. Por supuesto que devolver una ‘X’ no es obligatorio, puedes devolver cualquier otra letra que quieras.
Artículos relacionados:
Un error de concepto en la cláusula WHERE
Mostrando los resultados ordenados por cualquier criterio
Sandro Rocha Pamplona
Mar 04, 2016 @ 15:41:11
Hola Walter.. muy bueno el contenido. Una pequeña observación.El uso de la clausula CASE dentro de un WHERE no permite que la Engine (el motor) del Firebird haga uso de índices, entonces para tablas con muchos registros es bueno analisar el plan de ejecucíon.
Ariel Baran
Mar 04, 2016 @ 19:32:03
Hola Walter,
Para el caso de NULL se puede usar COALESCE
Saludos
wrov
Mar 04, 2016 @ 23:14:26
No en este caso porque te complicarías la vida, recuerda que lo que quieres saber es cual condición se cumplió.
Saludos.
Walter.
JOSE CARLOS MARTINEZ MAYORGA
Jun 09, 2016 @ 18:18:43
Buenas tardes, una duda, espero puedas apoyarme, necesito que a la hora de que no se cumpla una de las condiciones, no muestre ese registro. Se puede con este case o hay que hacer algo mas?
wrov
Jun 09, 2016 @ 18:59:48
En la cláusula WHERE se colocan las condiciones que debe cumplir un registro para que sea mostrado.
En el CASE se puede usar el operador lógico NOT para negar una condición.
Si no respondí tu pregunta, explica mejor lo que deseas.
Saludos.
Walter.
JOSE CARLOS MARTINEZ MAYORGA
Jun 09, 2016 @ 19:16:56
Hola. Mira mi detalle es el siguiente, tengo estos registros:
Codigo Nombre Unidades Unidades reales
1 pan de azucar 0 0
2 leche deslactosada 1 3
3 pan de ajo 0 4
4 margarina 3 0
lo que necesito es que la consulta verifique que unidades y unidades reales al ser ambos ceros, no me lo ponga en el resultado….
quedando asi:
Codigo Nombre Unidades Unidades reales
2 leche deslactosada 1 3
3 pan de ajo 0 4
4 margarina 3 0
JOSE CARLOS MARTINEZ MAYORGA
Jun 09, 2016 @ 19:16:24
Hola. Mira mi detalle es el siguiente, tengo estos registros:
Codigo Nombre Unidades Unidades reales
1 pan de azucar 0 0
2 leche deslactosada 1 3
3 pan de ajo 0 4
4 margarina 3 0
lo que necesito es que la consulta verifique que unidades y unidades reales al ser ambos ceros, no me lo ponga en el resultado….
quedando asi:
Codigo Nombre Unidades Unidades reales
2 leche deslactosada 1 3
3 pan de ajo 0 4
4 margarina 3 0
wrov
Jun 09, 2016 @ 19:24:17
Para una condición tan simple no necesitas usar un CASE, lo solucionas con algo como:
Saludos.
Walter.