SQL - ayuda consulta sql

 
Vista:

ayuda consulta sql

Publicado por ana (3 intervenciones) el 08/09/2011 15:35:30
Quiero hacer una query pero no consigo hacerla bien.
tengo una tabla con dos campos.

group| consolidate

test1 | 0
test2 | 0
test3 | 1
test4 | 1

yo quiero que cuando en un parametro -grupoparameter- meta un valor que no exista en la tabla muestre todos los registros y cuando meta un valor que si exista devuelva todas las filas de ese valor pero siempre que el campo consolidate sea igual a cero.


WHERE (group= @groupparameter AND
consolidate = 0) OR
('' LIKE @groupparameter )

Con esta query consigo sacar todos los registros cuando meto el valor vacio '' , pero me gustaria que al meter cualquier otro valor por ej text8 (que no está en la tabla) me lista todo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

ayuda consulta sql

Publicado por leonardo_josue (1173 intervenciones) el 08/09/2011 17:01:04
Hola Ana:

Antes que nada, mucho cuidado con poner palabras reservadas como nombres de campos (como el caso de GROUP) es mejor que pongas sus campos en español o que elijas alguna notación adicional, pues puedes tener problemas al momento de hacer las consultas. Para el ejemplo la tabla temporal que creo tiene nombres diferentes. OJO CON ESO.

No nos dices qué motor de BD estás utilizando, por lo que resulta complicado darte una respuesta puntual, sin embargo por el tipo de sintaxis que estás utilizando puedo suponer que estás trabajando con SQL Server. Existe un truco para hacer este tipo de consultas en SQL server, pero está enfocado a procedimientos almacenados, no tanto a consultas sencillas, la idea es que tu parámetro sea NULL cuando no exista ningún registro en la tabla que cumpla la condición... es algo complicado de explicar, pero sería más o menos así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
--En un procedimiento almacenado recibirías este parámetro,
--para fines del ejemplo lo pongo fijo
declare @groupparameter varchar(10)
set @groupparameter = 'test1'
 
declare @tabla table (grupo varchar(10), consolidado int)
insert into @tabla values ('test1', 0)
insert into @tabla values ('test2', 0)
insert into @tabla values ('test3', 1)
insert into @tabla values ('test4', 1)
 
--Aquí realizamos una busqueda normal, si existe en la tabla entonces el parámetro queda con el
--mismo valor, pero si no existe entonces el parámetro toma el valor de NULL
set @groupparameter = (select grupo from @tabla
WHERE grupo = @groupparameter AND consolidado = 0)
 
--Esta es la consulta final, lo único
select * from @tabla WHERE grupo = isnull(@groupparameter, grupo)
/*
grupo      consolidado
---------- -----------
test1      0
*/
 
--Para probar con otro valor en el parámetro
set @groupparameter = 'test8'
set @groupparameter = (select grupo from @tabla
WHERE grupo = @groupparameter AND consolidado = 0)
select * from @tabla WHERE grupo = isnull(@groupparameter, grupo)
/*
grupo      consolidado
---------- -----------
test1      0
test2      0
test3      1
test4      1
*/


Como verás, cuando el parámetro toma el valor de test1 sólo muestra un registro, pero cuando toma el valor de test8, al no existir en la tabla entonces muestra todos los registros.

Checa también esta liga:
http://www.forosdelweb.com/f87/procedimiento-con-where-opcional-511107/

Ahí se explica algo semejante.

Este truco sólo lo he utilizado en SQL Server, pero creo que debería funcionar también para otras BD, es cuestión de hacer algunas pruebas. Dale un vistazo y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ayuda consulta sql

Publicado por ana (3 intervenciones) el 08/09/2011 18:34:57
Ok buen truquillo.
Pero en lugar de hacer un procedimiento lo he hecho la subselect en la clausula where, aunque tiene un poco mas de coste la query pero no trae muchas filas.
where grupo = isnull (select top 1 a.grupo from tabla as a where a.grupo=@filtro and a.consolidado=0), grupo )
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar