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

El índice del blog Firebird21

El foro del blog Firebird21