Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Usar case en las condiciones de búsqueda

Estas en el tema de Usar case en las condiciones de búsqueda en el foro de SQL Server en Foros del Web. Es una consulta un poco liadilla y quizás esté mal planteada desde el principio. Código: ALTER PROCEDURE PA_BuscaTaxa ( @nome varchar(250) ) AS BEGIN DECLARE ...
  #1 (permalink)  
Antiguo 06/04/2006, 02:03
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Usar case en las condiciones de búsqueda

Es una consulta un poco liadilla y quizás esté mal planteada desde el principio.

Código:
ALTER PROCEDURE PA_BuscaTaxa
(
	@nome varchar(250)
)
AS
BEGIN
	DECLARE @tabla TABLE (ID int, Nombre nvarchar(250))
	INSERT INTO @tabla SELECT 
		(CASE WHEN tax.SinonimoDe IS NOT NULL THEN tax.SinonimoDe ELSE tax.ID END) AS "ID",
		(CASE 
			WHEN tax.IDTipo = 14 THEN RTRIM(padre2.Nombre)+' '+RTRIM(padre1.Nombre)+' subsp. '+RTRIM(tax.Nombre)
			WHEN tax.IDTipo = 13 THEN RTRIM(padre1.Nombre)+' '+RTRIM(tax.Nombre)
			WHEN tax.IDTipo < 13 THEN RTRIM(tax.Nombre)
		END) AS "Nombre"
		FROM tabTaxa as tax
		INNER JOIN
			tabTaxa AS padre1 ON padre1.ID = tax.IDPadre
		LEFT JOIN 
			tabTaxa AS padre2 ON padre2.ID = padre1.IDPadre
		WHERE 
			tax.Activado = 1
	SELECT * 
	FROM @tabla
	WHERE Nombre LIKE  '%'+@nome+'%'
END
Funciona bien casi siempre excepto cuando IDPadre es nulo. En realidad sólo hay un registro en tabTaxa donde IDPadre es nulo, pero tiene IDTipo < 13, por lo que no necesitaría de las tablas con alias padre1 y padre2. Había pensado en poner un condicional de este modo:
Código:
...
INNER JOIN
	tabTaxa AS padre1 ON padre1.ID = (CASE WHEN tax.IDPadre IS NOT NULL THEN tax.IDPadre ELSE ¿? END)
...
¿Alguna idea?

Gracias y un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #2 (permalink)  
Antiguo 06/04/2006, 14:20
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Prueba reemplazar el segundo case por:
Código:
Coalesce(RTRIM(padre2.Nombre)+' '+RTRIM(padre1.Nombre)+' subsp. '+RTRIM(tax.Nombre),
	RTRIM(padre1.Nombre)+' '+RTRIM(tax.Nombre),
	RTRIM(tax.Nombre)
)
Coalesce prueba de item en item hasta que encuentra uno NO nulo. Es decir, si padre2 es nulo[1] busca padre1[1], y si no, remata con tax.Nombre[2]

[1] En realidad es toda la sentencia de concatenación, pero con que este sea nulo provoca que se haga nula toda la concatenación
[2] Que podemos asumir, nunca será nulo.

Espero te sirva.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #3 (permalink)  
Antiguo 07/04/2006, 01:33
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Gracias por la respuesta Mithrandir. Todavía no lo he probado, aunque se me antoja que puede haber algún problema por lo siguiente:

Se trata de una tabla con una clasificación biológica, es decir hay registros desde el Reino hasta la Subespecie, de ahí el campo IDTipo. Cuando el IDTipo es 14 se trata de una subespecie por lo que el nombre completo debería ser Género especie subsp. subespecie. Como en el campo nombre sólo aparece subespecie, para devolever el nombre completo ha de consultar los nombres superiores a los que pertenece con IDPadre.

Cuando se llega o se consulta un género, IDTipo 12, no hace falta subir más para completar el nombre, aunque el campo IDPadre no sea nulo, porque el género pertenece a una subfamilia, ésta a una familia, etc.

Finalmente, al llegar a reino, IDTipo 1, el campo IDPadre es nulo, porque he determinado que el reino sea el punto de partida de la clasificación.

Qué rollo ¿no? Después de tanto escribir ya no me acuerdo de cuál era el problema (es que estoy un poco denso esta mañana y no discurro bien). Bueno, voy a probarlo y me dejo de complicaciones.

Gracias.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #4 (permalink)  
Antiguo 07/04/2006, 01:38
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Ah, ya me acuerdo.

padre1.Nombre puede no ser nulo, pero aún así no necesitarlo. En el caso del género, padre1.Nombre pertenece al nombre de la familia a la que pertenece y sin embargo no lo necesitamos porque el nombre del género es una sola palabra y no dos o tres como en el caso de la especie o la subespecie respectivamente. Es decir uso un CASE porque no depende de la nulidad del padre sino del tipo al que pertenece, 14, 13, 12, ...
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #5 (permalink)  
Antiguo 07/04/2006, 15:11
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Entiendo. Siendo ese el caso no veo mucha alternativa a reducir el código.

Probablemente hacerlo un poco más limpio usando un UDF donde le pases los 4 parámetros y te devuelva el valor esperado. Aunque técnicamente es mover esa misma sentencia a un lugar diferente.


Por otro lado, otra cosa que puedes hacer es intentar evitar la variable tipo tabla. ¿Has probado usar ese mimso WHERE sin usar la tabla?
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:36.