WHERE condicional

27/07/2007 - 05:10 por Norberto Kelijman | Informe spam
Es un Store Procedure que recibe varios parámetro int.
Los parámetros son para el WHERE. Si el parámetro es cero no hay que tenerlo
en cuenta.
Para comparaciones sencillas lo he resuelto así:

CREATE PROCEDURE Proc_Ejemplo
(@ idComprador int, @idVendedor int)
AS
SELECT * FROM tabla t
WHERE t.idComprador = CASE WHEN @idComprador = 0 THEN t.idComprador ELSE
@dComprador END AND
t.idVendedor = CASE WHEN @idVendedor = 0 THEN t.idVendedor ELSE
@idVendedor END

La idea es que si el parámetro es 0, en el WHERE se compara el campo con sí
mismo, o sea que el parámetro no se tiene en cuenta. Pero en esta forma de
hacerlo las condiciones se calculan igual.

Es un Store con muchos de esos parámetros, y algunas de las comparaciones
son bastante complejas, así que lo que busco es una solución en la que si el
parámetro es 0 esa condición directamente no exista. Algo así como intento
expresarlo después del AND:

WHERE t.idComprador = CASE WHEN @idComprador = 0 THEN t.idComprador ELSE
@idComprador END AND
CASE WHEN @idVendedor <> 0 THEN t.idVendedor = @idVendedor END

Pero por supuesto así no anda. El CASE es para uno de los términos de la
condición, no para poner o no la condición, que es lo que yo quiero.

Bueno, espero que se me entienda lo que pretendo pero no sé hacer.
Gracias.
 

Leer las respuestas

#1 Miguel Egea
27/07/2007 - 09:33 | Informe spam
Hola norberto desde el punto de vista del rendimiento lo mejor sería
utilizar ifs, ya sé que eso dará procedimientos almacenados bastante largos
pero no te queda otra.

hay qye ir también a ejecución dinámica, pero si se hace bien, no es mayor
problema.

create table pruebaif (idcomprador int, idvendedor int)
go
with mycte as
(select 1 id
union all
select id+1 from mycte where id<100)
insert into pruebaif
select c1.id idcomprador,c2.id idvendedor from mycte c1 cross join mycte c2
order by newid();
go
drop proc buscadato
go
create proc buscaDato @idComprador int, @idVendedor int
as
begin
declare @sql nvarchar(1000)
declare @parameters nvarchar(100)
set @sql ='SELECT idComprador,idVendedor FROM Pruebaif WHERE '
set @parameters= '@idComprador int ,@idVendedor int '

if @idComprador=0 and @idvendedor=0
begin
raiserror('Comprador o vendedor han de ser distintos de 0',16,1)
return -1 -- -1 será el error para parámetros incorrectos
end
if @idcomprador!=0
begin
set @sql= @sql + ' idComprador=@idComprador AND '
end

if @idvendedor!=0
begin
set @sql= @sql + ' idvendedor=@idvendedor AND '
end

set @sql=left(@sql,len(@sql)-4)
print @sql
print @parameters
exec sp_executesql
@sql,@parameters,@idComprador=@idcomprador,@idVendedor=@idVendedor
end
go

exec buscadato 0,0
exec buscadato 1,1
exec buscadato 1,0
exec buscadato 0,1




"Norberto Kelijman" wrote in message
news:e4jZxu$
Es un Store Procedure que recibe varios parámetro int.
Los parámetros son para el WHERE. Si el parámetro es cero no hay que
tenerlo en cuenta.
Para comparaciones sencillas lo he resuelto así:

CREATE PROCEDURE Proc_Ejemplo
(@ idComprador int, @idVendedor int)
AS
SELECT * FROM tabla t
WHERE t.idComprador = CASE WHEN @idComprador = 0 THEN t.idComprador ELSE
@dComprador END AND
t.idVendedor = CASE WHEN @idVendedor = 0 THEN t.idVendedor ELSE
@idVendedor END

La idea es que si el parámetro es 0, en el WHERE se compara el campo con
sí mismo, o sea que el parámetro no se tiene en cuenta. Pero en esta forma
de hacerlo las condiciones se calculan igual.

Es un Store con muchos de esos parámetros, y algunas de las comparaciones
son bastante complejas, así que lo que busco es una solución en la que si
el parámetro es 0 esa condición directamente no exista. Algo así como
intento expresarlo después del AND:

WHERE t.idComprador = CASE WHEN @idComprador = 0 THEN t.idComprador ELSE
@idComprador END AND
CASE WHEN @idVendedor <> 0 THEN t.idVendedor = @idVendedor END

Pero por supuesto así no anda. El CASE es para uno de los términos de la
condición, no para poner o no la condición, que es lo que yo quiero.

Bueno, espero que se me entienda lo que pretendo pero no sé hacer.
Gracias.




Preguntas similares