简体   繁体   English

SQl Server:首先对字母数字进行排序,然后是数字

[英]SQl Server : sort alphanumeric first followed by Numeric

SELECT  dbo.base_project.id as ID, 
        dbo.base_project.name as Name,
        dbo.base_project.status
FROM         dbo.base_project
ORDER BY   
Case When IsNumeric(dbo.base_project.name) = 1 
     then Right(Replicate('0',21) + dbo.base_project.name, 20)
     When IsNumeric(dbo.base_project.name) = 0 
     then Left(dbo.base_project.name + Replicate('',21), 20)
     Else dbo.base_project.name End

I'm able to sort numerically then alphanumeric.I need to reverse sort, where i need to sort Alphanumeric first and then Numerical 我能够按数字排序然后字母数字。我需要反向排序,我需要首先排序字母数字然后数字

Example: 例:

1, 3, 13036, 101-2011-009X2, 20-100281-01, ELO-001, ELO001B, ELO002B

You can accomplish this by using a subquery. 您可以使用子查询来完成此操作。 The subquery separates the numeric from the not numeric and gives them calculated fields so they can be used in the order by of the main query. 子查询将数字与非数字分开,并为它们提供计算字段,以便可以按主查询的顺序使用它们。

SELECT 
    A.ID
,   A.Name
,   A.status
FROM 
(
    SELECT  
        dbo.base_project.id as ID
    ,   dbo.base_project.name as Name
    ,   dbo.base_project.status
    ,   1 as ordering
    ,   RIGHT(REPLICATE('0',21) + dbo.base_project.name, 20) As padded
    FROM dbo.base_project
    WHERE ISNUMERIC(dbo.base_project.name) = 1
UNION
    SELECT  
        dbo.base_project.id as ID
    ,   dbo.base_project.name as Name
    ,   dbo.base_project.status
    ,   0 as ordering
    ,   LEFT(dbo.base_project.name + REPLICATE('',21), 20) As padded
    FROM dbo.base_project
    WHERE ISNUMERIC(dbo.base_project.name) <> 1
) A
ORDER BY A.ordering, A.padded

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM