Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server 2008 - ordre par chaînes avec numéro numériquement

Vous pouvez le faire en utilisant la fonction PATINDEX() comme ci-dessous :

select * from Test 
order by CAST(SUBSTRING(Name + '0', PATINDEX('%[0-9]%', Name + '0'), LEN(Name + '0')) AS INT)

Démo SQL Fiddle

Si vous avez des nombres au milieu de la chaîne, vous devez créer une petite fonction définie par l'utilisateur pour obtenir le nombre de la chaîne et trier les données en fonction de ce nombre comme ci-dessous :

CREATE FUNCTION dbo.fnGetNumberFromString (@strInput VARCHAR(255)) 
RETURNS VARCHAR(255) 
AS 
BEGIN 
    DECLARE @intNumber int 
    SET @intNumber = PATINDEX('%[^0-9]%', @strInput)

    WHILE @intNumber > 0
    BEGIN 
        SET @strInput = STUFF(@strInput, @intNumber, 1, '')
        SET @intNumber = PATINDEX('%[^0-9]%', @strInput)
    END 

    RETURN ISNULL(@strInput,0) 
END 
GO

Vous pouvez trier les données par :

select Name from Test order by dbo.fnGetNumberFromString(Name), Name