Query con CASE y valores NULL

13/07/2007 - 20:46 por Codigo47 | Informe spam
Tengo la siguiente tabla:

CLIENTE
IDCliente Cliente
IDUsuario IDUsuarioAlta
1
Esteban
1 2
2
Jose
3 1
3
Mario
2 NULL
4
Pedro
NULL 2
5
NULL
1 2

Y quiero hacer un Store que haga un SELECT, pudiendo pasarle todos los
campos de parametro y dependiendo si se paso un valor en un parametro:
que busque por ese valor, si No se paso un valor que lo ignore, si no
se paso ningun valor en los parametros, que sea igual a un SELECT *
FROM TABLA y por último si se pasan varios valores en los parametros,
que busque por todos esos campos y que el resultado coincida con todos
los valores.
Hice algo de todo esto, excepto que tengo problemas cuando el valor en
un campo es NULL. El query que hice es:

declare @IDCliente int
declare @Cliente varchar(50)
declare @IDUsuario int
declare @IDUsuarioAlta int

set @IDcliente = 0
set @Cliente = ''
set @IDUsuario = 0
set @IDUsuarioAlta = 0

select * from cliente
where
IDUsuario = CASE @IDUsuario WHEN 0 THEN IDUsuario ELSE @IDUsuario END
AND IDUsuarioAlta = CASE @IDUsuarioAlta WHEN 0 THEN IDUsuarioAlta
ELSE @IDUsuarioAlta END
AND idCliente = CASE @idCliente WHEN 0 THEN idCliente ELSE @idCliente
END
AND Cliente LIKE '%' + CASE @Cliente WHEN '' THEN Cliente ELSE
@Cliente END + '%'

El problema es simple, ese query, no trae los registros que tienen
algun campo con valor NULL (por ejemplo el Cliente con IDCLiente = 5,
tiene el campo Cliente igual a NULL y no lo trae, tambien el IDCliente
4, que tiene el campo IDUsuario igual a NULL).

Que se puede hacer para que traiga esos registros y cuando se pasan
valores no los traiga.

Gracias, saludos.

Preguntas similare

Leer las respuestas

#1 jcpc91
13/07/2007 - 21:29 | Informe spam
los procedimientos almacenados no aceptar ke se les pase valores null
esdecir no puedes hacer esto

EXECUTE MiStoreProcedure 'param1', 'param2', NULL

eso no se puede hacer tienes ke mandarle todos los paràmetros si no te
marca un error adviritiendote ke falta un paràmetro
Respuesta Responder a este mensaje
#2 jcpc91
13/07/2007 - 21:38 | Informe spam
SI QUIERES OBTENER VALORES NULL EN UN CAMPO TIENES KE DECIR ESTO

SELECT * FROM TABLA WHERE MICAMPO IS NULL

LA SENTENCIA "IS NULL" TE PERMITE OBTENER TODOS LOS CAMPOS DONDE LA
CONDICIÒN SEA NULL
Respuesta Responder a este mensaje
#3 Carlos M. Calvelo
13/07/2007 - 21:53 | Informe spam
On 13 jul, 20:46, Codigo47 wrote:
Tengo la siguiente tabla:

CLIENTE
IDCliente Cliente
IDUsuario IDUsuarioAlta
1
Esteban
1 2
2
Jose
3 1
3
Mario
2 NULL
4
Pedro
NULL 2
5
NULL
1 2

Y quiero hacer un Store que haga un SELECT, pudiendo pasarle todos los
campos de parametro y dependiendo si se paso un valor en un parametro:
que busque por ese valor, si No se paso un valor que lo ignore, si no
se paso ningun valor en los parametros, que sea igual a un SELECT *
FROM TABLA y por último si se pasan varios valores en los parametros,
que busque por todos esos campos y que el resultado coincida con todos
los valores.
Hice algo de todo esto, excepto que tengo problemas cuando el valor en
un campo es NULL. El query que hice es:

declare @IDCliente int
declare @Cliente varchar(50)
declare @IDUsuario int
declare @IDUsuarioAlta int

set @IDcliente = 0
set @Cliente = ''
set @IDUsuario = 0
set @IDUsuarioAlta = 0

select * from cliente
where
IDUsuario = CASE @IDUsuario WHEN 0 THEN IDUsuario ELSE @IDUsuario END
AND IDUsuarioAlta = CASE @IDUsuarioAlta WHEN 0 THEN IDUsuarioAlta
ELSE @IDUsuarioAlta END
AND idCliente = CASE @idCliente WHEN 0 THEN idCliente ELSE @idCliente
END
AND Cliente LIKE '%' + CASE @Cliente WHEN '' THEN Cliente ELSE
@Cliente END + '%'

El problema es simple, ese query, no trae los registros que tienen
algun campo con valor NULL (por ejemplo el Cliente con IDCLiente = 5,
tiene el campo Cliente igual a NULL y no lo trae, tambien el IDCliente
4, que tiene el campo IDUsuario igual a NULL).

Que se puede hacer para que traiga esos registros y cuando se pasan
valores no los traiga.

Gracias, saludos.




select * from cliente
where (@IDCliente = 0 OR IDCliente = @IDCliente) AND
(@Cliente = '' OR Cliente LIKE '%' + @Cliente + '%') AND
(@IDUsuario = 0 OR IDUsuario = @IDUsuario) AND
(@IDUsuarioAlta = 0 OR IDUsuarioAlta = @IDUsuarioAlta)

Saludos,
Carlos
Respuesta Responder a este mensaje
#4 Alejandro Mesa
13/07/2007 - 22:38 | Informe spam
En este articulo se analiza este tema a fondo.

Dynamic Search Conditions in T-SQL
http://www.sommarskog.se/dyn-search.html


AMB

"Codigo47" wrote:

Tengo la siguiente tabla:

CLIENTE
IDCliente Cliente
IDUsuario IDUsuarioAlta
1
Esteban
1 2
2
Jose
3 1
3
Mario
2 NULL
4
Pedro
NULL 2
5
NULL
1 2

Y quiero hacer un Store que haga un SELECT, pudiendo pasarle todos los
campos de parametro y dependiendo si se paso un valor en un parametro:
que busque por ese valor, si No se paso un valor que lo ignore, si no
se paso ningun valor en los parametros, que sea igual a un SELECT *
FROM TABLA y por último si se pasan varios valores en los parametros,
que busque por todos esos campos y que el resultado coincida con todos
los valores.
Hice algo de todo esto, excepto que tengo problemas cuando el valor en
un campo es NULL. El query que hice es:

declare @IDCliente int
declare @Cliente varchar(50)
declare @IDUsuario int
declare @IDUsuarioAlta int

set @IDcliente = 0
set @Cliente = ''
set @IDUsuario = 0
set @IDUsuarioAlta = 0

select * from cliente
where
IDUsuario = CASE @IDUsuario WHEN 0 THEN IDUsuario ELSE @IDUsuario END
AND IDUsuarioAlta = CASE @IDUsuarioAlta WHEN 0 THEN IDUsuarioAlta
ELSE @IDUsuarioAlta END
AND idCliente = CASE @idCliente WHEN 0 THEN idCliente ELSE @idCliente
END
AND Cliente LIKE '%' + CASE @Cliente WHEN '' THEN Cliente ELSE
@Cliente END + '%'

El problema es simple, ese query, no trae los registros que tienen
algun campo con valor NULL (por ejemplo el Cliente con IDCLiente = 5,
tiene el campo Cliente igual a NULL y no lo trae, tambien el IDCliente
4, que tiene el campo IDUsuario igual a NULL).

Que se puede hacer para que traiga esos registros y cuando se pasan
valores no los traiga.

Gracias, saludos.


Respuesta Responder a este mensaje
#5 jcpc91
14/07/2007 - 01:31 | Informe spam
si se pueden crear procedimientos almacenados con valor null
solo se tiene ke asignar un valor por derault al paramàmetro de la
siguiente manera:

CREATE PROCEDURE miproc
@param1 NVARCHAR(19) = NULL --de esta forma estás indicando ke
el parámetro tendrá un valor null por default
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida