Condiciones booleanas en Where?

 

Con
cierta frecuencia debemos recurrir a algunas tecnicas de desarrollo que nos
permiten optimizar nuestro trabajo en una forma simple y mantenible, en este caso
particular tiene que ver con el diseño de un procedimiento almacenado que me
permitiera hacer una consulta cuyas condiciones estaran basadas en los
parametros de entrada, delimitando o filtrando los  resultados.

 

El
ejemplo basico que utilizaremos usa la Base de Datos Northwind, y consiste en
obtener todos los registros de la tabla Orders que coincidan con los filtros
relacionados a: Codigo de Empleado, Codigo de Cliente y Via de Compra
(ShipVia). 

 

CREATE PROCEDURE uspGetOrders

(

 @CustomerID
nchar(5)=null,

 @EmployeeID
int=null,

 @ShipVia
int=null

)

As

 

SELECT * FROM dbo.Orders

WHERE (CustomerID=COALESCE(@CustomerID,CustomerID))

AND (EmployeeID=COALESCE(@EmployeeID,EmployeeID))

AND (ShipVia=COALESCE(@ShipVia,ShipVia))

  Set @tabla=’Products’

 

En este
segmento de código podemos observar que se reciben los parametros antes
mencionados, pero teniendo un default value igual a null, en caso de que no se
envie un parametro este sera obviado en el procesamiento o filtro de la
consulta. 

Al
momento de establecer las condiciones del Where por ejemplo: CustomerID=COALESCE(@CustomerID,CustomerID))

Estamos
indicando que la columna CustomerID sera igual al valor retornado por la
funcion Coalesce la cual nos retorna el primer valor no nulo, por lo que en
caso de que el parametro sea diferente de nulo se tendra conformada la
condicion, y en caso de ser null entonces procede a establecer CustomerID=CustomerID,
esto representa una condicion de igualdad, lo que no causa ningun procesamiento
y sirve perfectamente a nuestro objetivo.

Cuando
procedemos a ejecutar el sp pasamos los valores a determinados parametros según
nuestras necesidades.   Como ejemplo:

 

EXEC uspGetOrders

@CustomerID=’PICCO’,

@EmployeeID=2

 

Nos devuelven 3 registros.

 

O

 

EXEC uspGetOrders

@CustomerID=’PICCO’

 

Nos devuelve 10 registros

 

Esta
solucion a mi parecer resulta mas simple y menos compleja que otras en las que
utilizan IF o instrucciones CASE WHEN.