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在你的问题中是指用另一个字符串替换一个字符串