martes, 28 de febrero de 2012

Comparar cadenas en SQLServer

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:

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

1 comentario: