Si probamos a filtrar un listado de cadenas entre dos valores (desde, hasta) directamente en SQLServer (campoCadena>='010A' and campoCadena<='0100000') veremos que el resultado no es el esperado. Esto se puede solucionar creandonos la siguiente función:
En el ejemplo anterior damos solución a filtrar un listado de códigos postales (los cuales contienen letras) desde unos valores desde y hasta que introduzca el usuario.
Esta función devolverá 1 en el caso en el que @cp sea mayor que @otroCP, -1 en el caso contrario y 0 si són iguales.
Aquí tenemos el ejemplo de aplicación:
CREATE FUNCTION [dbo].[compareCP] ( @cp varchar(50), @otroCP varchar(50) )
RETURNS int
BEGIN
DECLARE @position int;
SET @position = 1
IF(LEN(@cp)<LEN(@otroCP))
RETURN -1
ELSE IF(LEN(@cp)>LEN(@otroCP))
RETURN 1
ELSE BEGIN
WHILE @position <= LEN(@cp)
BEGIN
IF(ASCII(SUBSTRING(@cp, @position, 1))<ASCII(SUBSTRING(@otroCP, @position, 1)))
RETURN -1
ELSE IF(ASCII(SUBSTRING(@cp, @position, 1))>ASCII(SUBSTRING(@otroCP, @position, 1)))
RETURN 1
SET @position = @position + 1
END
END
RETURN 0
END
GO
En el ejemplo anterior damos solución a filtrar un listado de códigos postales (los cuales contienen letras) desde unos valores desde y hasta que introduzca el usuario.
Esta función devolverá 1 en el caso en el que @cp sea mayor que @otroCP, -1 en el caso contrario y 0 si són iguales.
Aquí tenemos el ejemplo de aplicación:
select codigoPostal from codigoPostal where dbo.compareCP(codigoPostal,'VALORDESDE')>=0 and dbo.compareCP(codigoPostal,'VALORHASTA')<=0
Excelente
ResponderEliminar