sql排序问题

郑先锋 2017-09-24 07:13:19
我这边有个字段是varchar类型的,里面有存数字和字符串,要怎么排序才正确?
现在排序成了1,10,2,20这种
...全文
95 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
郑先锋 2017-09-24
  • 打赏
  • 举报
回复
引用 14 楼 sinat_28984567 的回复:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([a1] nvarchar(22))
Insert #T
select N'1' union all
select N'2L' union all
select N'20XL' union all
select N'10S' union all
select N'L码'
Go
--测试数据结束
SELECT  *
FROM    #T
ORDER BY CASE WHEN PATINDEX('%[0-9]%', [a1]) > 0
              THEN CONVERT(INT, SUBSTRING([a1], PATINDEX('%[0-9]%', [a1]),
                                          CASE WHEN PATINDEX('%[0-9][^0-9]%',
                                                             [a1]) > 0
                                               THEN PATINDEX('%[0-9][^0-9]%',
                                                             [a1])
                                               ELSE LEN(a1)
                                          END - PATINDEX('%[0-9]%', [a1]) + 1))
              ELSE 100000
         END;
谢大神
郑先锋 2017-09-24
  • 打赏
  • 举报
回复
引用 11 楼 sinat_28984567 的回复:
[quote=引用 10楼我是你的主体 的回复:][quote=引用 9 楼 sinat_28984567 的回复:] 试试这样:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([a1] nvarchar(22))
Insert #T
select N'1' union all
select N'2L' union all
select N'20XL' union all
select N'10S' union all
select N'L码'
Go
--测试数据结束
SELECT  *
FROM    #T
ORDER BY CASE WHEN PATINDEX('%[0-9]%', [a1]) > 0
              THEN SUBSTRING([a1], PATINDEX('%[^0-9][0-9]%', [a1]) + 1,
                             LEN([a1]) - PATINDEX('%[^0-9][0-9]%', [a1]))
              ELSE a1
         END;
不行啊,查出来是这样的 1 2 3 32 32L 34 34P 36 38 38XXL 4 5 6 7 8 9 4,5,6都跑到后面了[/quote]9楼那个写的不就是在后边么?正确的是什么样的?[/quote] 就是1,2,3,4,5,32L,32Z
郑先锋 2017-09-24
  • 打赏
  • 举报
回复
引用 11 楼 sinat_28984567 的回复:
[quote=引用 10楼我是你的主体 的回复:][quote=引用 9 楼 sinat_28984567 的回复:]
试试这样:
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([a1] nvarchar(22))
Insert #T
select N'1' union all
select N'2L' union all
select N'20XL' union all
select N'10S' union all
select N'L码'
Go
--测试数据结束
SELECT *
FROM #T
ORDER BY CASE WHEN PATINDEX('%[0-9]%', [a1]) > 0
THEN SUBSTRING([a1], PATINDEX('%[^0-9][0-9]%', [a1]) + 1,
LEN([a1]) - PATINDEX('%[^0-9][0-9]%', [a1]))
ELSE a1
END;




不行啊,查出来是这样的
1
2
3
32
32L
34
34P
36
38
38XXL
4
5
6
7
8
9

4,5,6都跑到后面了[/quote]9楼那个写的不就是在后边么?正确的是什么样的?[/quote]



想改成数字排序,数字加字符的在数字排序后面
郑先锋 2017-09-24
  • 打赏
  • 举报
回复
引用 9 楼 sinat_28984567 的回复:
试试这样:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([a1] nvarchar(22))
Insert #T
select N'1' union all
select N'2L' union all
select N'20XL' union all
select N'10S' union all
select N'L码'
Go
--测试数据结束
SELECT  *
FROM    #T
ORDER BY CASE WHEN PATINDEX('%[0-9]%', [a1]) > 0
              THEN SUBSTRING([a1], PATINDEX('%[^0-9][0-9]%', [a1]) + 1,
                             LEN([a1]) - PATINDEX('%[^0-9][0-9]%', [a1]))
              ELSE a1
         END;
不行啊,查出来是这样的 1 2 3 32 32L 34 34P 36 38 38XXL 4 5 6 7 8 9 4,5,6都跑到后面了
二月十六 版主 2017-09-24
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([a1] nvarchar(22))
Insert #T
select N'1' union all
select N'2L' union all
select N'20XL' union all
select N'10S' union all
select N'L码'
Go
--测试数据结束
SELECT *
FROM #T
ORDER BY CASE WHEN PATINDEX('%[0-9]%', [a1]) > 0
THEN CONVERT(INT, SUBSTRING([a1], PATINDEX('%[0-9]%', [a1]),
CASE WHEN PATINDEX('%[0-9][^0-9]%',
[a1]) > 0
THEN PATINDEX('%[0-9][^0-9]%',
[a1])
ELSE LEN(a1)
END - PATINDEX('%[0-9]%', [a1]) + 1))
ELSE 100000
END;


二月十六 版主 2017-09-24
  • 打赏
  • 举报
回复
引用 10楼我是你的主体 的回复:
[quote=引用 9 楼 sinat_28984567 的回复:] 试试这样:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([a1] nvarchar(22))
Insert #T
select N'1' union all
select N'2L' union all
select N'20XL' union all
select N'10S' union all
select N'L码'
Go
--测试数据结束
SELECT  *
FROM    #T
ORDER BY CASE WHEN PATINDEX('%[0-9]%', [a1]) > 0
              THEN SUBSTRING([a1], PATINDEX('%[^0-9][0-9]%', [a1]) + 1,
                             LEN([a1]) - PATINDEX('%[^0-9][0-9]%', [a1]))
              ELSE a1
         END;
不行啊,查出来是这样的 1 2 3 32 32L 34 34P 36 38 38XXL 4 5 6 7 8 9 4,5,6都跑到后面了[/quote]9楼那个写的不就是在后边么?正确的是什么样的?
听雨停了 2017-09-24
  • 打赏
  • 举报
回复
引用 2 楼 郑先锋的回复:
[quote=引用 1 楼 qq_37170555 的回复:] order by cast(字段 as int)
不行,该字段还有字符[/quote] 那你想要怎么排序,字符排在哪,数字后面?还是数字前面
二月十六 版主 2017-09-24
  • 打赏
  • 举报
回复
试试这样:
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([a1] nvarchar(22))
Insert #T
select N'1' union all
select N'2L' union all
select N'20XL' union all
select N'10S' union all
select N'L码'
Go
--测试数据结束
SELECT *
FROM #T
ORDER BY CASE WHEN PATINDEX('%[0-9]%', [a1]) > 0
THEN SUBSTRING([a1], PATINDEX('%[^0-9][0-9]%', [a1]) + 1,
LEN([a1]) - PATINDEX('%[^0-9][0-9]%', [a1]))
ELSE a1
END;


郑先锋 2017-09-24
  • 打赏
  • 举报
回复
引用 5 楼 qq_37170555 的回复:
会不会一个里面有字符又有数字的啊
像这种普通order by出来就是这样,我想把数字排好就可以 1 2 3 32 32L 34 34P 36 38 38XXL 4 5 6 7 8 9 L码 M码 XL码 XXL码
二月十六 版主 2017-09-24
  • 打赏
  • 举报
回复
如果是1、10、1啊这三个顺序是什么样的?
郑先锋 2017-09-24
  • 打赏
  • 举报
回复
引用 5 楼 qq_37170555 的回复:
会不会一个里面有字符又有数字的啊
现在数字就按照数字排,字符按照字符排,数字加字符的,字符在前按照字符排,数字在前按照数字排 不过最主要解决一个表有字符和数字可以分开来排序
听雨停了 2017-09-24
  • 打赏
  • 举报
回复
会不会一个里面有字符又有数字的啊
郑先锋 2017-09-24
  • 打赏
  • 举报
回复
引用 1 楼 qq_37170555 的回复:
order by cast(字段 as int)
想让数字的按数字排序,字符的按字符排序
郑先锋 2017-09-24
  • 打赏
  • 举报
回复
引用 1 楼 qq_37170555 的回复:
order by cast(字段 as int)
不行,该字段还有字符
听雨停了 2017-09-24
  • 打赏
  • 举报
回复
order by cast(字段 as int)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧