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

#6 Guillermo Peralta
29/05/2007 - 04:19 | Informe spam
Excelente, muchas gracias por tus aportes, me ha quedado más claro.

Saludos
Guillermo
AG-CBA-ARG


"Jesús López" escribió en el mensaje
news:
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





Respuesta Responder a este mensaje
#7 Alejandro Mesa
29/05/2007 - 16:12 | Informe spam
Guillermo Peralta,

En ningun momento trate de recomendar el uso de SQL dinamico, pues no has
posteado informacion necesaria como para tal recomendacion.

- Estructura de las tablas, incluyendo indices
- Selectividad de los indices basada en los valores a filtrar
- Posibilidad de dar permiso de acceso directo, a los usuarios, sobre las
tablas en question o no.

Por eso te pase dos articulos, el primero habla sobre como hacer busqueda
dinamica sin necesidad de usar SQL dinamico y el segundo sobre usar SQL
dinamico para llevar a cabo la misma facilidad.


AMB


"Guillermo Peralta" wrote:

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
#8 Guillermo Peralta
29/05/2007 - 18:12 | Informe spam
Entonces disculpa, pense que el primer articulo hablaba de como usar SQL
Dinámico, ahora que lo he visto con más detenimiento veo que habla de las
distintas formas de resolver el problema. No lo lei con más detalle debido a
que ya habia logrado una solucion con lo propuesto por Jesús López.

Muchas Gracias

Saludos
Guillermo
AG - CBA - ARG


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

En ningun momento trate de recomendar el uso de SQL dinamico, pues no has
posteado informacion necesaria como para tal recomendacion.

- Estructura de las tablas, incluyendo indices
- Selectividad de los indices basada en los valores a filtrar
- Posibilidad de dar permiso de acceso directo, a los usuarios, sobre las
tablas en question o no.

Por eso te pase dos articulos, el primero habla sobre como hacer busqueda
dinamica sin necesidad de usar SQL dinamico y el segundo sobre usar SQL
dinamico para llevar a cabo la misma facilidad.


AMB


"Guillermo Peralta" wrote:

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
#9 Ignacio Holguin
29/05/2007 - 19:15 | Informe spam
Utiliza esta sentencia:

SELECT * FROM Empleados WHERE ( isnull(@IdCategoria, 0) = 0 or
IdCategoria = @IdCategoria)

Yo la utilizo sin problema.

Saludos.
Ignacio Holguin Banda
Programador Senior TI



"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
#10 Maxi
29/05/2007 - 22:43 | Informe spam
Hola, esa consulta funcionara bien si hay pocos registros, pero si la tabla
es grande sera de muy mal rendimiendo ya que no usara de forma eficiente los
indices, deben tratar de evitar el uso de

where funcion(campo) = algo, la cosa deberia ser where campo = funcion / o
valor

Revisa los planes de ejecucion sobre tus consultas y veras que no usa bien
el indice de esa forma


-
Microsoft M.V.P en SQLServer
SQLTotal Consulting - Servicios en SQLServer
Email:
"Ignacio Holguin" escribió en el mensaje
news:
Utiliza esta sentencia:

SELECT * FROM Empleados WHERE ( isnull(@IdCategoria, 0) = 0 or
IdCategoria = @IdCategoria)

Yo la utilizo sin problema.

Saludos.
Ignacio Holguin Banda
Programador Senior TI



"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







email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida