none
consulta con parametros RRS feed

  • Pregunta

  • Hola a todos, agradecería mucho su ayuda; ya que tengo una consulta y no se como ajustar, tengo mi select 

    Select * from alumnos

    where ( fecha1 <=year(getdate()) and fecha2 is null or fecha2=0 or fecha2 >= year(getdate()))--acá me funciona bien 

    or (temaPadre = 'prueba1' or temaPadre  = 'prueba2' or temaPadre = 'prueba3')-- al agregar esto, ya no tiene en cuenta mis dos primeras condiciones. y vuelve y me traer todos los registros.

    Cómo puedo ajustar la consulta?

    Gracias.


    sandra

    lunes, 22 de febrero de 2021 17:10

Todas las respuestas

  • Hola sandraguerrero:

    A priori, sería 

    Select * from alumnos
    
    where ( fecha1 <=year(getdate()) and fecha2 is null or fecha2=0 or fecha2 >= year(getdate()))--acá me funciona bien 
    
    And (temaPadre = 'prueba1' or temaPadre  = 'prueba2' or temaPadre = 'prueba3')
    Pero los criterios que muestras son un poco "raros". Quizá deberías de poner un ejemplo con datos, para poder ayudarte.

    lunes, 22 de febrero de 2021 18:12
  • Hola Javi, gracias por responder, tienes toda la razón que los datos pueden ser confusos, por eso mejor dejo el ejemplo de datos, son dos tablas:

    Me explico mejor, la consulta lo tengo en un procedimiento almacenado donde los parametros son, 

    @codigoregion INT,-- es obligatorio
    @nivel2 varchar(20)=null,
    @nivel3 varchar(20)=null,
    @nivel4 varchar(20)=null 

    Como los parametros nivel2,nivel 3  y nivel 4 no lo puedo tomar de los campos nivel2,nivel3 y nivel4 xq xq en ese campo solo se encuentra el número y no el código completo; lo podría tomar del campo temaPadre  y así traer todos los registros que tenga ese como temapadre.

    Tabla 1

    tabla 1
    id CODIGO nombre temaPadre nivel2 nivel 3  fecha1 fecha2
    1 A-1234 prueba 1 A 2020
    2 A-1235-01 prueba 5 A-1235 1235 2021
    3 A-1235-02 prueba 2 A-1235 1235 2020 0
    4 A-1236-02 prueba 3 A-1236 1236 2020
    5 A-1237 prueba 4 A 2020 2020
    6 A-1235-02-01 prueba 6 A-1235-02 1235 2021

    tablas 2 

    id idtabla1 codigoRegion
    1 1 2
    2 2 2
    3 3 2
    4 4 2
    5 5 2
    6 2 3
    7 3 3
    8 4 3
    9 6 3

    En mi consulta tengo

    select * from tabla1 INNER JOIN tabla2 ON (tabla1 .id= tabla2 .idTabla1)
    
    where (fecha1 <= YEAR(GETDATE()) 
    	AND(fecha2 IS NULL or  fecha2 = 0 or fecha2 >= YEAR(GETDATE()))
    	AND tabla2.codigoRegion=@codigoRegion)
    AND ((temapadre=@nivel2 or @nivel2 is null) or  (@nivel 3 or @nivel3 is null ) )
    

    El problema es que si yo dejo:

    AND ((temapadre=@nivel2 or @nivel2 is null) or  (@nivel 3 or @nivel3 is null ) )

    no me trae los datos porque los parametros @nivel2  y @nivel3 están nulos cuando consulto y efectivamente puede haber la opción que los envié en null.

    si dejo :

    AND ((temapadre=@nivel2 or @nivel2 is null) or  (@nivel 3 or @nivel3 is null ) )

    el problema es que me trae datos sin importar mis primeras condiciones de And donde valido fecha1, fecha2 y 

    codigoRegion.

    Gracias.


    sandra


    lunes, 22 de febrero de 2021 19:33
  • Hola sandraguerrero:

    Pegar los datos como texto es complicado en esta web, porque no respeta ningún formato y hay que adivinar los datos, en función de una supuesta posición.

    DROP TABLE IF EXISTS dbo.Tabla1;
    DROP TABLE IF EXISTS dbo.Tabla2;
    Create table dbo.tabla1(id int, codigo varchar(15), nombre varchar(15), temapadre int, nivel2 varchar(10), nivel3 varchar(10), fecha1 int, fecha2 int)
    go
    Insert into dbo.tabla1 (id, codigo, nombre, temapadre, nivel2, nivel3, fecha1, fecha2)
    values
    (1,'A-1234'		 ,'prueba',1,'A'	 ,NULL	 ,2020,NULL	),
    (2,'A-1235-01'	 ,'prueba',5,'A-1235','1235	',2021,NULL	),
    (3,'A-1235-02'	 ,'prueba',2,'A-1235','1235	',2020,0	),
    (4,'A-1236-02'	 ,'prueba',3,'A-1236','1236	',2020,NULL	),
    (5,'A-1237'		 ,'prueba',4,'A'	 ,NULL	 ,2020,2020	),
    (6,'A-1235-02-01','prueba',6,'A-1235-02', '1235'	,  2021,Null)
    GO
    Create table dbo.Tabla2 (id int, idtabla1 int, codigoRegion int)
    Go
    Insert into dbo.Tabla2(id, idtabla1,codigoRegion)
    values
    (1,1,2),
    (2,2,2),
    (3,3,2),
    (4,4,2),
    (5,5,2),
    (6,2,3),
    (7,3,3),
    (8,4,3),
    (9,6,3);
    go

    Suponiendo que más o menos, sea este el escenario.

    Tampoco es que sea obligatoriamente así, pero para la posible solución, vale.

    Lo primero, cuando quieres restringir filas, según añadas condiciones al where estas van con un AND, pero la restricción anterior, tiene que estar cerrada.

    select * from tabla1 INNER JOIN tabla2 ON (tabla1.id= tabla2.idTabla1)
    where	(fecha1 <= YEAR(GETDATE()))

    Si observas, los paréntesis están cerrados, por tanto ahora, voy a añadir lo que has puesto como fecha2

    Select * from tabla1 INNER JOIN tabla2 ON tabla1.id = tabla2.idTabla1
    Where (fecha1 <= YEAR(GETDATE()))
    AND 
    (fecha2 IS NULL or fecha2 = 0 or fecha2 >= YEAR(GETDATE()))

    Esto es lo que tenías, con cada parte completamente cerrada e independiente.

    Vamos a añaidir el temaPadre.

    Declare @nivel2 varchar(20)='5';
    
    Select * 
    from tabla1 INNER JOIN tabla2 ON Tabla1.id = tabla2.idTabla1
    Where 
    (fecha1 <= YEAR(GETDATE()))
    AND
    (fecha2 IS NULL or fecha2 = 0 or fecha2 >= YEAR(GETDATE()))
    AND
    (tabla1.temaPadre = CAST(@nivel2 as int) or @nivel2 is null)

    Al añadir el siguiente parámetro, buscamos que temaPadre sea igual al parámetro o el parámetro sea null.

    select * from tabla1 INNER JOIN tabla2 ON (tabla1.id= tabla2.idTabla1)
    where	(fecha1 <= YEAR(GETDATE())) 
    		AND
    		(fecha2 IS NULL or  fecha2 = 0 or fecha2 >= YEAR(GETDATE()))
    		AND
    		(tabla1.temaPadre = CAST(@nivel2 as int) or @nivel2 is null)
    		And
    		(tabla1.temaPadre = CAST(@nivel3 as int) or @nivel3 is null)

    Podríamos añadir otra restricción para el parámetro 3  que sea igual a .... o parametro null y así sucesivamente, con todos los que necesitemos.

    Además tienes que tener en cuenta cositas a mejorar.

    Si como dices es un procedimiento almacenado, no utilices funciones, tales como year(getdate()), mejor crea una variable, asigna a la variable la función e iguala a la variable


    lunes, 22 de febrero de 2021 21:18