在我的表VARCHAR数据类型列CartonNo中,该列包含数字或带有它所依赖的字母的数字。我希望它是数字排序,这将是一个可接受的升序排序顺序。
例如,包含如下数据
1-2
1
3-5
6
1-2A
6-12
7-8
9-12D
9-12
17
9-12B
19
20-30
15-18现在我想按下面的顺序排列数据
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
有人能告诉我该怎么写这个查询吗?
发布于 2015-10-08 09:34:22
我假设在-之前,您将始终具有integer值
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')查询
select * from @temp
order by CAST(LEFT(val,CHARINDEX('-',val)-1) AS INT)正序
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.当上面的答案出现错误时.如何正确排序。
-- 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结果:

发布于 2021-12-13 22:05:17
ORDER BY LEN(column1), column1,LEN(column2), column2,LEN(column3), column3通常适用于“通过数字排序对字母数字值进行排序”这一一般情况。
您可以按任意数量的列订购。
发布于 2015-10-13 10:10:06
对此我很抱歉
我认为下面的查询是可以的
SELECT * FROM table_name ORDER BY cast(CartonNo as decimal(38,10)) asc;https://dba.stackexchange.com/questions/117379
复制相似问题