首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对varchar类型列(字母数字值)进行排序

对varchar类型列(字母数字值)进行排序
EN

Database Administration用户
提问于 2015-10-08 09:16:24
回答 3查看 4.1K关注 0票数 4

在我的表VARCHAR数据类型列CartonNo中,该列包含数字或带有它所依赖的字母的数字。我希望它是数字排序,这将是一个可接受的升序排序顺序。

  • 第1期

例如,包含如下数据

代码语言:javascript
复制
1-2
1
3-5
6
1-2A
6-12
7-8
9-12D
9-12
17
9-12B
19
20-30
15-18

现在我想按下面的顺序排列数据

代码语言:javascript
复制
1
1-2
1-2A
3-5
6
6-12
7-8
9-12
9-12B
9-12D
15-18
17
19
20-30
  • 第二期

下面的值如何排序字母数字?

PT15-8-2

10 15-12-10

PT15-12-3

PT15-12-572-575

31 15-12-31

PT11-96

36 11-133-36

PT11-133

PT16-136

PT8-644

PT09 09-655

PT9-655

PT12-752

PT14-752

PT13 13-752

PT14-753

PT10-778

PT13 13-977-978

PT13 13-979-988

有人能告诉我该怎么写这个查询吗?

EN

回答 3

Database Administration用户

回答已采纳

发布于 2015-10-08 09:34:22

我假设在-之前,您将始终具有integer

代码语言:javascript
复制
declare @temp table
(val nvarchar(99))
insert into @temp values ('1-2'  )
insert into @temp values ('3-5'  )
insert into @temp values ('1-2A')
insert into @temp values ('6-12')
insert into @temp values ('6-7')
insert into @temp values ('6-12D')
insert into @temp values ('20-30')
insert into @temp values ('15-18')
--insert into @temp values ('3')
--insert into @temp values ('53')

查询

代码语言:javascript
复制
select * from @temp
order by CAST(LEFT(val,CHARINDEX('-',val)-1)  AS INT)

正序

代码语言:javascript
复制
select * from @temp
order by CAST(LEFT(val,CHARINDEX('-',val)-1)  AS INT)
,CAST(LEFT(RIGHT(val,LEN(val)-CHARINDEX('-',val)), patindex('%[^0-9]%', RIGHT(val,LEN(val)-CHARINDEX('-',val))+'.') - 1)  AS INT),
RIGHT(val,LEN(val)-CHARINDEX('-',val))

运行第二个查询后,输出将是

更新后的评论:有时varchar瓦尔不会来(3-5)或(1-12A),而不是整个数字3或5.当上面的答案出现错误时.如何正确排序。

代码语言:javascript
复制
-- DECLARE TABLE
DECLARE @temp TABLE
(val nvarchar(99))

--INSERT INTO TABLE
INSERT INTO @temp VALUES 
('1-2'), ('1'), ('3-5'), ('6'), ('1-2A'), ('6-12'), ('7-8'), ('9-12D'), ('9-12'), ('17'), ('9-12B'), ('19'), ('20-30'), ('15-18')

-- QUERY
SELECT * FROM @temp
ORDER BY
CASE 
    WHEN ISNUMERIC(val) = 0 THEN CAST(LEFT(val,CHARINDEX('-',val)-1)  AS INT)
    WHEN ISNUMERIC(val) = 0 THEN CAST(LEFT(RIGHT(val,LEN(val)-CHARINDEX('-',val)), patindex('%[^0-9]%', RIGHT(val,LEN(val)-CHARINDEX('-',val))+'.') - 1)  AS INT)
    ELSE val 
    END ,val

结果:

票数 3
EN

Database Administration用户

发布于 2021-12-13 22:05:17

ORDER BY LEN(column1), column1,LEN(column2), column2,LEN(column3), column3通常适用于“通过数字排序对字母数字值进行排序”这一一般情况。

您可以按任意数量的列订购。

票数 0
EN

Database Administration用户

发布于 2015-10-13 10:10:06

对此我很抱歉

我认为下面的查询是可以的

代码语言:javascript
复制
SELECT * FROM table_name ORDER BY cast(CartonNo as decimal(38,10)) asc;
票数 -5
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/117379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档