Consulta con OR?

28/05/2007 - 17:50 por Guillermo Peralta | Informe spam
Hola a todos;

Cómo podria efectuar la siguiente consulta?


IdEmpleado
Nombre
IdCategoria

1 || Guillermo || 4
2 || Juan || 5
3 || Pedro || 5


Me gustaria efectuar una consulta del siguiente modo:

Si ingreso un valor para IdCategoria por ejemplo el 4, me deberia devolver a
1 || Guillermo
Si ingreso un valor para IdCategoria por ejemplo el 5, me deberia devolver a
2 || Juan y 3 || Pedro

En cambio sin ingreso un valor nulo, (podria ser cero) me deberia devolver
los tres registros, es decir sin efectuar ninguna condicion

Habia pensado algo asi con el uso del OR
declare @IdCategoria int

set @IdCategoria = 4 -- en este caso me deberia devolver a Guillermo

Select * from Empleados

Where (IdCategoria = @IdCategoria) or ( IdCategoria = IdCategoria )

pero no funciona así (creo)



Alguna idea?

Gracias






Saludos
Guillermo
AG - CBA - ARG

Preguntas similare

Leer las respuestas

#1 Jesús López
28/05/2007 - 18:28 | Informe spam
Sería así:

SELECT * FROM Empleados WHERE IdCategoria = @IdCategoria OR @IdCategoria IS
NULL

Sin embargo no te lo recomiendo, SQL Server es ineficiente para este tipo de
consultas.

Yo usaría esta otra consulta:

IF @IdCategoria IS NULL
SELECT * FROM Empleados
ELSE
SELECT * FROM Empleados WHERE IdCategoria = @IdCategoria


Saludos:


Jesús López
www.solidq.com



"Guillermo Peralta" escribió en el
mensaje news:e64Jd$
Hola a todos;

Cómo podria efectuar la siguiente consulta?


IdEmpleado
Nombre
IdCategoria

1 || Guillermo || 4
2 || Juan || 5
3 || Pedro || 5


Me gustaria efectuar una consulta del siguiente modo:

Si ingreso un valor para IdCategoria por ejemplo el 4, me deberia devolver
a 1 || Guillermo
Si ingreso un valor para IdCategoria por ejemplo el 5, me deberia devolver
a 2 || Juan y 3 || Pedro

En cambio sin ingreso un valor nulo, (podria ser cero) me deberia devolver
los tres registros, es decir sin efectuar ninguna condicion

Habia pensado algo asi con el uso del OR
declare @IdCategoria int

set @IdCategoria = 4 -- en este caso me deberia devolver a Guillermo

Select * from Empleados

Where (IdCategoria = @IdCategoria) or ( IdCategoria = IdCategoria )

valuaria, pero no funciona así (creo)



Alguna idea?

Gracias






Saludos
Guillermo
AG - CBA - ARG



Respuesta Responder a este mensaje
#2 Guillermo Peralta
28/05/2007 - 19:19 | Informe spam
Hola Jesús, muchas gracias:

Evaluaré el tema de la ineficiencia
Lo que sucede es que no es solo filtrar por Categoria sino hasta por 8 o 9
campos más, entonces pretendia hacer una consulta más legible


SELECT * FROM Empleados WHERE (IdCategoria = @IdCategoria OR @IdCategoria IS
NULL)
and (IdCargo =
@IdCargo OR @IdCargo is null)
and (IdSindicato =
@IdSindicato OR @IdSindicato is null) ..etc

Me parece que es más simple de leer y mantener, no sabria como resolverlo de
manera eficiente de la segunda manera que me propones

Utilizo SqlServer 2005 Express

Lo dicho, muchas gracias por tu ayuda


Saludos
Guillermo
AG - CBA - ARG


"Jesús López" escribió en el mensaje
news:

Sería así:

SELECT * FROM Empleados WHERE IdCategoria = @IdCategoria OR @IdCategoria
IS NULL

Sin embargo no te lo recomiendo, SQL Server es ineficiente para este tipo
de consultas.

Yo usaría esta otra consulta:

IF @IdCategoria IS NULL
SELECT * FROM Empleados
ELSE
SELECT * FROM Empleados WHERE IdCategoria = @IdCategoria


Saludos:


Jesús López
www.solidq.com



"Guillermo Peralta" escribió en el
mensaje news:e64Jd$
Hola a todos;

Cómo podria efectuar la siguiente consulta?


IdEmpleado
Nombre
IdCategoria

1 || Guillermo || 4
2 || Juan || 5
3 || Pedro || 5


Me gustaria efectuar una consulta del siguiente modo:

Si ingreso un valor para IdCategoria por ejemplo el 4, me deberia
devolver a 1 || Guillermo
Si ingreso un valor para IdCategoria por ejemplo el 5, me deberia
devolver a 2 || Juan y 3 || Pedro

En cambio sin ingreso un valor nulo, (podria ser cero) me deberia
devolver los tres registros, es decir sin efectuar ninguna condicion

Habia pensado algo asi con el uso del OR
declare @IdCategoria int

set @IdCategoria = 4 -- en este caso me deberia devolver a Guillermo

Select * from Empleados

Where (IdCategoria = @IdCategoria) or ( IdCategoria = IdCategoria )

valuaria, pero no funciona así (creo)



Alguna idea?

Gracias






Saludos
Guillermo
AG - CBA - ARG







Respuesta Responder a este mensaje
#3 Alejandro Mesa
28/05/2007 - 20:38 | Informe spam
Guillermo,

Espero esto te sea de ayuda.

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

Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html


AMB


"Guillermo Peralta" wrote:

Hola Jesús, muchas gracias:

Evaluaré el tema de la ineficiencia
Lo que sucede es que no es solo filtrar por Categoria sino hasta por 8 o 9
campos más, entonces pretendia hacer una consulta más legible


SELECT * FROM Empleados WHERE (IdCategoria = @IdCategoria OR @IdCategoria IS
NULL)
and (IdCargo =
@IdCargo OR @IdCargo is null)
and (IdSindicato =
@IdSindicato OR @IdSindicato is null) ..etc

Me parece que es más simple de leer y mantener, no sabria como resolverlo de
manera eficiente de la segunda manera que me propones

Utilizo SqlServer 2005 Express

Lo dicho, muchas gracias por tu ayuda


Saludos
Guillermo
AG - CBA - ARG


"Jesús López" escribió en el mensaje
news:
>
> Sería así:
>
> SELECT * FROM Empleados WHERE IdCategoria = @IdCategoria OR @IdCategoria
> IS NULL
>
> Sin embargo no te lo recomiendo, SQL Server es ineficiente para este tipo
> de consultas.
>
> Yo usaría esta otra consulta:
>
> IF @IdCategoria IS NULL
> SELECT * FROM Empleados
> ELSE
> SELECT * FROM Empleados WHERE IdCategoria = @IdCategoria
>
>
> Saludos:
>
>
> Jesús López
> www.solidq.com
>
>
>
> "Guillermo Peralta" escribió en el
> mensaje news:e64Jd$
>> Hola a todos;
>>
>> Cómo podria efectuar la siguiente consulta?
>>
>>
>> IdEmpleado
>> Nombre
>> IdCategoria
>>
>> 1 || Guillermo || 4
>> 2 || Juan || 5
>> 3 || Pedro || 5
>>
>>
>> Me gustaria efectuar una consulta del siguiente modo:
>>
>> Si ingreso un valor para IdCategoria por ejemplo el 4, me deberia
>> devolver a 1 || Guillermo
>> Si ingreso un valor para IdCategoria por ejemplo el 5, me deberia
>> devolver a 2 || Juan y 3 || Pedro
>>
>> En cambio sin ingreso un valor nulo, (podria ser cero) me deberia
>> devolver los tres registros, es decir sin efectuar ninguna condicion
>>
>> Habia pensado algo asi con el uso del OR
>> declare @IdCategoria int
>>
>> set @IdCategoria = 4 -- en este caso me deberia devolver a Guillermo
>>
>> Select * from Empleados
>>
>> Where (IdCategoria = @IdCategoria) or ( IdCategoria = IdCategoria )
>>
>> valuaria, pero no funciona así (creo)
>>
>>
>>
>> Alguna idea?
>>
>> Gracias
>>
>>
>>
>>
>>
>>
>> Saludos
>> Guillermo
>> AG - CBA - ARG
>>
>>
>>
>
>



Respuesta Responder a este mensaje
#4 Guillermo Peralta
28/05/2007 - 21:11 | Informe spam
Gracias Alejandro, tambien habia pensado en usar SQL dinámico, pero trato de
evitarlo, de echo en otras ocasiones que he tenido que "armar" la sentencia
lo hago directamente desde la aplicacion.
Solo que en esta oportunidad pretendo llevar la mayor parte del trabajo al
server.

En este caso particular piensas que es mejor utilizar sql dinamico en
relacion a la alternativa que me propuso Jesús teniendo en cuenta las
ineficiencias que él menciona?


Saludos
Guillermo
AG - CBA - ARG


"Alejandro Mesa" escribió en el
mensaje news:
Guillermo,

Espero esto te sea de ayuda.

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

Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html


AMB


"Guillermo Peralta" wrote:

Hola Jesús, muchas gracias:

Evaluaré el tema de la ineficiencia
Lo que sucede es que no es solo filtrar por Categoria sino hasta por 8 o
9
campos más, entonces pretendia hacer una consulta más legible


SELECT * FROM Empleados WHERE (IdCategoria = @IdCategoria OR @IdCategoria
IS
NULL)
and (IdCargo >> @IdCargo OR @IdCargo is null)
and (IdSindicato
>> @IdSindicato OR @IdSindicato is null) ..etc

Me parece que es más simple de leer y mantener, no sabria como resolverlo
de
manera eficiente de la segunda manera que me propones

Utilizo SqlServer 2005 Express

Lo dicho, muchas gracias por tu ayuda


Saludos
Guillermo
AG - CBA - ARG


"Jesús López" escribió en el mensaje
news:
>
> Sería así:
>
> SELECT * FROM Empleados WHERE IdCategoria = @IdCategoria OR
> @IdCategoria
> IS NULL
>
> Sin embargo no te lo recomiendo, SQL Server es ineficiente para este
> tipo
> de consultas.
>
> Yo usaría esta otra consulta:
>
> IF @IdCategoria IS NULL
> SELECT * FROM Empleados
> ELSE
> SELECT * FROM Empleados WHERE IdCategoria = @IdCategoria
>
>
> Saludos:
>
>
> Jesús López
> www.solidq.com
>
>
>
> "Guillermo Peralta" escribió en
> el
> mensaje news:e64Jd$
>> Hola a todos;
>>
>> Cómo podria efectuar la siguiente consulta?
>>
>>
>> IdEmpleado
>> Nombre
>> IdCategoria
>>
>> 1 || Guillermo || 4
>> 2 || Juan || 5
>> 3 || Pedro || 5
>>
>>
>> Me gustaria efectuar una consulta del siguiente modo:
>>
>> Si ingreso un valor para IdCategoria por ejemplo el 4, me deberia
>> devolver a 1 || Guillermo
>> Si ingreso un valor para IdCategoria por ejemplo el 5, me deberia
>> devolver a 2 || Juan y 3 || Pedro
>>
>> En cambio sin ingreso un valor nulo, (podria ser cero) me deberia
>> devolver los tres registros, es decir sin efectuar ninguna condicion
>>
>> Habia pensado algo asi con el uso del OR
>> declare @IdCategoria int
>>
>> set @IdCategoria = 4 -- en este caso me deberia devolver a Guillermo
>>
>> Select * from Empleados
>>
>> Where (IdCategoria = @IdCategoria) or ( IdCategoria = IdCategoria )
>>
>> valuaria, pero no funciona así (creo)
>>
>>
>>
>> Alguna idea?
>>
>> Gracias
>>
>>
>>
>>
>>
>>
>> Saludos
>> Guillermo
>> AG - CBA - ARG
>>
>>
>>
>
>



Respuesta Responder a este mensaje
#5 Jesús López
28/05/2007 - 22:12 | Informe spam
Para dos o incluso tres parámetros de búsqueda podría usarse sql estático,
pero para 4 o más es mejor usar sql dinámico. Ten en cuenta que el número de
combinaciones (número de sentencias estáticas) es igual dos elevado al
número de parámetros. Entoces para 3 parámetros serían 8 sentencias
estáticas y para 4 serían 16.

Usar la técnica OR es muy ineficiente, yo no te la recomiendo, aunque desde
luego es la más simple. Sería algo así:

SELECT *
FROM Tabla
WHERE (Campo1 = @Param1 OR @Param1 IS NULL) AND (Campo2 = @Param2 OR @Param2
IS NULL) AND

Repito que para 4 o más parámetros de búsqueda es preferible sql dinámico ya
que la complejidad del procedimiento crece linealmente con el número de
parámetros (un IF por cada parámetro) a diferencia de las sentencias
estáticas con la que la complejidad crece de forma exponencial. Utilizado de
forma correcta, el sql dinámico es muy eficiente ya que usará los índices
que haya en la tabla si SQL Server lo considera oportuno y no prensenta
problemas de inyección SQL cuando se usa correctamente.


El procedimiento sería algo así:

CREATE PROCEDURE BuscarEnTabla
@Param1 tipo1,
@Param2 tipo2,
@Param3 tipo3,
.
AS
DECLARE @sql nvarchar(max) -- en SQL Server 2000 sería nvarchar(4000)
SET @sql = N'SELECT * FROM Tabla WHERE 1 = 1'

IF @Param1 IS NOT NULL
SET @sql = @sql + N' AND Campo1 = @Param1'

IF @Param2 IS NOT NULL
SET @sql = @sql + N' AND Campo2 = @Param2'

IF @Param2 IS NOT NULL
SET @sql = @sql + N' AND Campo2 = @Param2'



EXEC sp_executesql @sql, N'@Param1 tipo1, @Param2 tipo2, @Param3 tipo3,
..',
@Param1, @Param2, @Param3, .


Saludos:


Jesús López
www.solidq.com





"Guillermo Peralta" escribió en el
mensaje news:
Gracias Alejandro, tambien habia pensado en usar SQL dinámico, pero trato
de evitarlo, de echo en otras ocasiones que he tenido que "armar" la
sentencia lo hago directamente desde la aplicacion.
Solo que en esta oportunidad pretendo llevar la mayor parte del trabajo al
server.

En este caso particular piensas que es mejor utilizar sql dinamico en
relacion a la alternativa que me propuso Jesús teniendo en cuenta las
ineficiencias que él menciona?


Saludos
Guillermo
AG - CBA - ARG


"Alejandro Mesa" escribió en el
mensaje news:
Guillermo,

Espero esto te sea de ayuda.

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

Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html


AMB


"Guillermo Peralta" wrote:

Hola Jesús, muchas gracias:

Evaluaré el tema de la ineficiencia
Lo que sucede es que no es solo filtrar por Categoria sino hasta por 8 o
9
campos más, entonces pretendia hacer una consulta más legible


SELECT * FROM Empleados WHERE (IdCategoria = @IdCategoria OR
@IdCategoria IS
NULL)
and (IdCargo >>> @IdCargo OR @IdCargo is null)
and (IdSindicato
>>> @IdSindicato OR @IdSindicato is null) ..etc

Me parece que es más simple de leer y mantener, no sabria como
resolverlo de
manera eficiente de la segunda manera que me propones

Utilizo SqlServer 2005 Express

Lo dicho, muchas gracias por tu ayuda


Saludos
Guillermo
AG - CBA - ARG


"Jesús López" escribió en el mensaje
news:
>
> Sería así:
>
> SELECT * FROM Empleados WHERE IdCategoria = @IdCategoria OR
> @IdCategoria
> IS NULL
>
> Sin embargo no te lo recomiendo, SQL Server es ineficiente para este
> tipo
> de consultas.
>
> Yo usaría esta otra consulta:
>
> IF @IdCategoria IS NULL
> SELECT * FROM Empleados
> ELSE
> SELECT * FROM Empleados WHERE IdCategoria = @IdCategoria
>
>
> Saludos:
>
>
> Jesús López
> www.solidq.com
>
>
>
> "Guillermo Peralta" escribió en
> el
> mensaje news:e64Jd$
>> Hola a todos;
>>
>> Cómo podria efectuar la siguiente consulta?
>>
>>
>> IdEmpleado
>> Nombre
>> IdCategoria
>>
>> 1 || Guillermo || 4
>> 2 || Juan || 5
>> 3 || Pedro || 5
>>
>>
>> Me gustaria efectuar una consulta del siguiente modo:
>>
>> Si ingreso un valor para IdCategoria por ejemplo el 4, me deberia
>> devolver a 1 || Guillermo
>> Si ingreso un valor para IdCategoria por ejemplo el 5, me deberia
>> devolver a 2 || Juan y 3 || Pedro
>>
>> En cambio sin ingreso un valor nulo, (podria ser cero) me deberia
>> devolver los tres registros, es decir sin efectuar ninguna condicion
>>
>> Habia pensado algo asi con el uso del OR
>> declare @IdCategoria int
>>
>> set @IdCategoria = 4 -- en este caso me deberia devolver a Guillermo
>>
>> Select * from Empleados
>>
>> Where (IdCategoria = @IdCategoria) or ( IdCategoria = IdCategoria )
>>
>> valuaria, pero no funciona así (creo)
>>
>>
>>
>> Alguna idea?
>>
>> Gracias
>>
>>
>>
>>
>>
>>
>> Saludos
>> Guillermo
>> AG - CBA - ARG
>>
>>
>>
>
>









Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida