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

Comodín % en columna int

Estas en el tema de Comodín % en columna int en el foro de SQL Server en Foros del Web. Quizás sea una tontería, pero como hago para que una condición sobre una columna numérica pueda contener cualquier valor: Código: WHERE tax.Activado = @activado AND ...
  #1 (permalink)  
Antiguo 06/04/2006, 06:28
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
Comodín % en columna int

Quizás sea una tontería, pero como hago para que una condición sobre una columna numérica pueda contener cualquier valor:

Código:
WHERE tax.Activado = @activado AND
tax.Usuario LIKE (CASE WHEN @usuario IS NULL THEN '%' ELSE @usuario END)
Lo que me da error: Error de sintaxis al convertir el valor varchar '%' para una columna de tipo de datos int.

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:24
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
No esoty seguro que esto funcione, pero puedes probar:

WHERE tax.Activado = @activado AND
tax.Usuario LIKE (CASE WHEN Convert(NVarChar, @usuario) IS NULL THEN '%' ELSE @usuario END)

O bien,

WHERE tax.Activado = @activado AND
tax.Usuario LIKE '%' + Convert(NVarChar, @usuario) + '%'

Asumuendo que @usuario no es de tipo caracter (por el tipo de mensaje de error), si no, olvídate del convert y por @usuario directamente.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #3 (permalink)  
Antiguo 07/04/2006, 01:53
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
@usuario es de tipo int pero le asigno el valor null por defecto en el procedimiento almacenado, en el caso de que no se le haya especificado ningún valor en la llamada. El campo Usuario también es de tipo int.

Es decir si en la llamada al procedimiento no se especifica el valor del parámetro @usuario, la condición de búsqueda sobre el campo Usuario no sería necesaria, o lo que es lo mismo, que el valor de Usuario puede ser cualquiera.

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!
  #4 (permalink)  
Antiguo 07/04/2006, 03:21
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
Lo siento pero no me funciona ninguna de las dos maneras.
__________________
¡¡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, 11:32
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 4 meses
Puntos: 98
A lo mejor no te entendí bien, pero más bien creo que el asunto es hacer un query u otro dependiendo de usuario

Código:
IF @usuario > 0
BEGIN
   SELECT .... condicion con usuario
END 
ELSE
BEGIN
  SELECT...condicion sin usuario(cualquier usuario)
END

GO
Y quizás controlar como le pasas el parámetro usuario desde tu aplicación, para que se cumpla esa condición.

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #6 (permalink)  
Antiguo 07/04/2006, 15:22
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Ah, entonces es normal el error. LIKE es para cadenas.

Puedes forzar la conversión del numero a cadena dentro de la sentencia y así poder usar el LIKE, pero eso obliga a hacer un tablescan que lo hará ineficente.

...AND Convert(NVarChar(30), tax.Usuario) LIKE (CASE WHEN @....

En ese caso tienes que hacer lo que te dice u_g, o bien, ver por el lado del sql dinámico; pero para variar, eso también tiene sus desventajas:
http://www.sommarskog.se/dynamic_sql.html
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #7 (permalink)  
Antiguo 10/04/2006, 02:15
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 a los dos.

Sí, se trata de hacer una consulta dependiendo del parámetro usuario. La consulta es muy larga y es identica se haya definido el parámetro o no, por lo que pensé que era mejor utilizar un condicional en los criterios de selección. Para no duplicar un montón de código exactamente igual dentro del procedimiento.

¿Cómo de ineficiente sería usar Convert(NVarChar(30), tax.Usuario)?

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!
  #8 (permalink)  
Antiguo 10/04/2006, 03:06
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
Ya he probado Convert(NVarChar(30), tax.Usuario) y también CAST pero me sigue devolviendo el mismo error. Probaré la sugerencia de u_goldman aunque tenga que duplicar código, porque si no, veo que no salgo de aquí nunca.

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!
  #9 (permalink)  
Antiguo 10/04/2006, 03:25
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
Listo. Gracias a los dos.
__________________
¡¡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!
  #10 (permalink)  
Antiguo 10/04/2006, 10:18
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 4 meses
Puntos: 98
Cita:
Iniciado por Bravenap
Gracias a los dos.

Sí, se trata de hacer una consulta dependiendo del parámetro usuario. La consulta es muy larga y es identica se haya definido el parámetro o no, por lo que pensé que era mejor utilizar un condicional en los criterios de selección. Para no duplicar un montón de código exactamente igual dentro del procedimiento.

¿Cómo de ineficiente sería usar Convert(NVarChar(30), tax.Usuario)?

Un saludo.

Desgraciadamente no existe tal cosa dinámica con los stored procedures, regularmente si se trata de que la consulta crece dependiendo del parámetro, por seguir un orden y por el mantenimiento, querrás hacer condiciones, aunque tengas que repetir mucho, al final quedará mas claro, y siempre te ayuda el viejo truco del copy & paste

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #11 (permalink)  
Antiguo 10/04/2006, 10:45
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
Como puntilla final voy a poner el procedimiento completo, que por cierto estaba liado también en otro tema del foro de SQL Server. Más o menos funciona como pretendía, aunque eso sí, no estoy nada seguro del rendimiento. En fin, allá va:

Código:
ALTER PROCEDURE PA_BuscaTaxa
(
	@nome varchar(250),
	@act bit = 1,
	@cientifico bit = 1,
	@usuario varchar(4) = '%',
	@aut varchar(250) = '%',
	@inicial bit = 0
)
AS
BEGIN
	DECLARE @tabla TABLE (ID int, Nombre nvarchar(250),Autor nvarchar(250),Usuario  varchar(4))
	IF @cientifico = 1
	BEGIN
		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)+(CASE WHEN tax.SinonimoDe IS NOT NULL THEN ' *' ELSE '' END) AS "Nombre",
			Autor = (CASE WHEN tax.Autor IS NULL THEN ' ' ELSE tax.Autor END),
			Usuario = (CASE WHEN tax.Usuario IS NULL THEN ' ' ELSE CONVERT(varchar(4),tax.Usuario) END)
			FROM tabTaxa as tax
			INNER JOIN
				tabTaxa AS padre1 ON padre1.ID LIKE (CASE WHEN tax.IDPadre IS NOT NULL THEN tax.IDPadre ELSE NULL END)
			LEFT JOIN 
				tabTaxa AS padre2 ON padre2.ID LIKE (CASE WHEN padre1.IDPadre IS NOT NULL THEN padre1.IDPadre ELSE NULL END)
			WHERE 
				tax.Activado = @act
	END
	ELSE
	BEGIN
		INSERT INTO @tabla SELECT
			vul.IDTaxa AS "ID",
			vul.Nombre,
			Autor = (CASE WHEN tax.Autor IS NULL THEN ' ' ELSE tax.Autor END),
			Usuario = (CASE WHEN tax.Usuario IS NULL THEN ' ' ELSE CONVERT(varchar(4),tax.Usuario) END)
			FROM nombresVulgares AS vul
			INNER JOIN
				tabTaxa AS tax ON tax.ID = vul.IDTaxa
			WHERE
				vul.Nombre LIKE '%'+@nome+'%'
				AND
				tax.Activado = @act
	END

	SELECT * 
	FROM @tabla	
	WHERE 	
		Nombre LIKE  (CASE WHEN @inicial = 1 THEN SUBSTRING(@nome,1,1)+'%' ELSE '%'+@nome+'%'  END)
		AND 
		RTRIM(Autor) LIKE @aut
		AND 
		RTRIM(Usuario) LIKE @usuario
END
Como ya os he comentado sigo peleado con una parte del procedmiento, ya que no me devuelve los valores cuando IDPadre es nulo. Eso está en este tema.

Un saludo y gracias de nuevo.
__________________
¡¡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!
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 00:29.