Sql 按varchar字母表顺序对数据排序

Sql 按varchar字母表顺序对数据排序,sql,sql-server-2008,sql-server-2008-r2,Sql,Sql Server 2008,Sql Server 2008 R2,我有一张包含以下数据的表格 1 AAAAA01 AAAAA01 AAAAA01 B21 AAAAAA1 B3 AB100 我想按以下顺序对数据进行排序 AAAAAA1 AAAAA01 AAAAA01 AAAAA01 AB100 B21 B3 1 我写了一份声明,但没有给出正确的结果 Select * from dbo.Section order by CASE WHEN not Section

我有一张包含以下数据的表格

 1
 AAAAA01 
 AAAAA01
 AAAAA01
 B21
 AAAAAA1
 B3
 AB100
我想按以下顺序对数据进行排序

 AAAAAA1
 AAAAA01
 AAAAA01
 AAAAA01
 AB100
 B21
 B3
 1
我写了一份声明,但没有给出正确的结果

    Select
    *
from
    dbo.Section
order by      
    CASE    
      WHEN not Section like '%[^0-9]%' THEN CONVERT(int,Section)
      WHEN  Section like '[0-9]%' THEN CONVERT(int,SUBSTRING(Section,1,PATINDEX('%[A-Z]%',Section)-900000))
    END
为了您的帮助,我提供了表的脚本

  INSERT [dbo].[Section] ([Section]) VALUES (N'1')
INSERT [dbo].[Section] ([Section]) VALUES (N'AAAAA01')
INSERT [dbo].[Section] ([Section]) VALUES (N'AAAAA01')
INSERT [dbo].[Section] ([Section]) VALUES (N'AAAAA01')
INSERT [dbo].[Section] ([Section]) VALUES (N'AAAAA01')
INSERT [dbo].[Section] ([Section]) VALUES (N'AAAAA01')
INSERT [dbo].[Section] ([Section]) VALUES (N'B21')
INSERT [dbo].[Section] ([Section]) VALUES (N'AAAAAA1')
INSERT [dbo].[Section] ([Section]) VALUES (N'B3')
INSERT [dbo].[Section] ([Section]) VALUES (N'AB100')
INSERT [dbo].[Section] ([Section]) VALUES (N'2')
INSERT [dbo].[Section] ([Section]) VALUES (N'B1')
INSERT [dbo].[Section] ([Section]) VALUES (N'B32')
INSERT [dbo].[Section] ([Section]) VALUES (N'11')
INSERT [dbo].[Section] ([Section]) VALUES (N'A10')
INSERT [dbo].[Section] ([Section]) VALUES (N'ABAAAA') 

你能告诉我这是怎么给我提供正确答案的吗

我试图将您的字段一分为二,alpha和num。为了按alpha、first和num、second对查询进行排序。
但是
AAAAA1
是在
AAAA01
之后加上我的逻辑。。。您是否有明确的规则来解释为什么要在
aaaaaa1
之前使用
AAAA01

SELECT SECTION.section,
        CASE
            WHEN section NOT LIKE '%[^A-Z]'
            THEN section
            WHEN section LIKE '[A-Z]%'
            THEN
               LEFT (section, PATINDEX ('%[^A-Z]%', section)-1)                  
            ELSE
            'ZZZZZZZZZZZZZ'
         END
            AS Alpha,
            CASE
            WHEN ISNUMERIC(section)=1 
            THEN CAST( section AS int)
            WHEN SECTION.section LIKE '%[0-9]'
            THEN
               CAST( RIGHT (section, PATINDEX ('%[^0-9]%', REVERSE (section))-1 ) AS INT)
            ELSE
               0       
         END
            AS Num

    FROM SECTION
ORDER BY Alpha, Num;

这个SQL怎么样?我尝试了你的数据,它返回了正确的顺序

SELECT section
FROM section
ORDER BY LEN(LEFT(Section, PATINDEX('%[0-9]%', Section)-1)) DESC
回应@A.Goutam下面的评论(很抱歉,我不知道如何在评论中添加图像)

我刚刚复制了@A.Goutam提供的数据,并直接在我的sql server中进行了尝试,如下所示

使用新数据的新SQL查询

SELECT section AS section
FROM section
ORDER BY LEN(section + '1') DESC
    , LEN(LEFT(section + '1', PATINDEX('%[0-9]%', section + '1')-1)) DESC
    , CONVERT(INT,SUBSTRING(section + '1',PATINDEX('%[0-9]%',section + '1'),LEN(section + '1'))) DESC
结果:

AAAAAA1
AAAAA01
AAAAA01
AAAAA01
AAAAA01
AAAAA01
ABAAAA
AB100
B32
B21
A10
B3
B1
11
2
1
请尝试:

Select    
    *
from
    dbo.Section
order by
    REPLACE
    (REPLACE
    (REPLACE
    (REPLACE
    (REPLACE
    (REPLACE
    (REPLACE
    (REPLACE
    (REPLACE
    (REPLACE ([Section], '0', 'ZZ0'),
    '1', 'ZZ1'),
    '2', 'ZZ2'),
    '3', 'ZZ3'),
    '4', 'ZZ4'),
    '5', 'ZZ5'),
    '6', 'ZZ6'),
    '7', 'ZZ7'),
    '8', 'ZZ8'),
    '9', 'ZZ9'),
    [Section]

选择新测试数据的结果:


请检查它对你是否正确

您也可以使用临时表完成您想要完成的任务。但是,对于较大的记录,这可能会增加一些性能开销。所以,我建议你少用它

CREATE table #temp
(
    Section varchar(20)
)
INSERT INTO #temp
   SELECT * FROM dbo.Section WHERE section LIKE '[A-Z]%' order by section ASC
INSERT INTO #temp
   SELECT * FROM dbo.Section WHERE section LIKE '[0-9]%' order by section ASC

SELECT * FROM #temp
drop table #temp

这是另一种方式。假设您的数字字符串大于-100000000

SELECT YourString
FROM YourTable
ORDER BY CASE WHEN YourString LIKE '[0-9]%' THEN 
                        CONVERT(int, YourString) ELSE -100000000  END, YourString

您的表是
,列名也是
?@lad2025表名和列名都是节您能用文字描述一下想要的排序吗?@jarlh想对从A开始的内容进行排序并遍历所有A。然后B。。。Z@jarlh在此之后,如果任何带有字符lijke的数字均为AAAAA,则AAAAA为1,然后AAAAA01在结束所有字符后开始表单1,所以在我的示例1中position@FaithirMohamad
传递给LEFT或SUBSTRING函数的长度参数无效抱歉,此错误适用于@A.GoutamHi@A.Goutam提供的给定值集。请您按照我在编辑的帖子中给出的方式截取您的查询截图?@FathirMohamad i hv add table insert script in question请在您的table@A.Goutam我添加了新的查询。请检查是否与您的需要匹配所有结果都很好,但B1后B中的问题结果将是B1-B21-B3-B32匹配排序,从左到右除外B。。。一切都很顺利@Stepan Novikov谢谢我在做你的答案。如果你喜欢我的问题,请记下我的问题一个小问题什么是替换(replace)(replace在你的问题中是指用另一个字符串替换一个字符串