首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle/MYSQL:对包含字母数字值的列的select查询中的记录进行排序

Oracle/MYSQL:对包含字母数字值的列的select查询中的记录进行排序
EN

Stack Overflow用户
提问于 2013-01-17 00:35:45
回答 3查看 775关注 0票数 0

我知道这项质询是以不同的形式提出的,但我的要求却有少许不同。

假设我有一个包含如下数据的表:

代码语言:javascript
复制
ID  NAME        VALUE

-----------------------------

1   ABC-2-2     X
2   PQRS-1-3    Y
3   ABC-3-2     Z
4   PQRS-1-4    A
5   PQRS-3-4    B
6   MNO-2-1     C
7   AAA-1       D
8   BBB-2       E
9   CCC-3       F

现在,我期望的输出应该如下所示:

代码语言:javascript
复制
ID  NAME        VALUE

-----------------------------
7   AAA-1       D
2   PQRS-1-3    Y
4   PQRS-1-4    A
8   BBB-2       E
6   MNO-2-1     C
1   ABC-2-2     X
9   CCC-3       F
3   ABC-3-2     Z
5   PQRS-3-4    B

请注意,这不是直接的字母数字排序。相反,忽略第一个"-“之前的值,并根据名称中第一个"-”之后的内容对字段进行排序。

我对PL/SQL不是很熟悉,在这方面有任何帮助都将不胜感激。

谢谢。

PS:请注意,这应该在Oracle和MySQL上都有效。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-17 00:38:52

对于您的示例,这就足够了(Oracle语法):

代码语言:javascript
复制
ORDER BY SUBSTR(name,4)

如果第一个连字符之前的字符数可以改变,您可以这样做(同样是Oracle语法):

代码语言:javascript
复制
ORDER BY SUBSTR(name,INSTR(name,'-')+1)

然而,如果你有这样的代码,那就不能工作了:

代码语言:javascript
复制
AAA-10-1
AAA-8-1
AAA-9-1

并期望在AAA-9-1之后出现AAA-10-1。然后,您需要进一步解析它:

代码语言:javascript
复制
ORDER BY LPAD(SUBSTR(name,INSTR(name,'-')+1, INSTR(name,'-',1,2)-INSTR(name,'-')-1),10,'0'),
         LPAD(SUBSTR(name,INSTR(name,'-',1,2)+1),10,'0')

(注意:我已经使用LPAD(x,10,'0000000001‘)将类似'1’的值转换为‘0000000001’,而不是使用TO_NUMBER,因为如果数据中有任何非数字,这可能会失败。)

示例:

代码语言:javascript
复制
with data as
(
select 'AAA-1' name from dual
union all
select 'PQR-1-4' name from dual
union all
select 'PQR-1-3' name from dual
union all
select 'AAA-10-10' name from dual
union all
select 'AAA-10-1' name from dual
union all
select 'AAA-9-10' name from dual
union all
select 'AAA-9-1' name from dual
)
select *
from data
ORDER BY LPAD(SUBSTR(name,INSTR(name,'-')+1, INSTR(name,'-',1,2)-INSTR(name,'-')-1),10,'0'),
         LPAD(SUBSTR(name,INSTR(name,'-',1,2)+1),10,'0');

输出:

代码语言:javascript
复制
NAME
---------
PQR-1-3
PQR-1-4
AAA-9-1
AAA-9-10
AAA-10-1
AAA-10-10
AAA-1

如果AAA-1应该在第一位:

代码语言:javascript
复制
ORDER BY LPAD(SUBSTR(name,INSTR(name,'-')+1, INSTR(name||'-','-',1,2)-INSTR(name,'-')-1),10,'0'),
         LPAD(SUBSTR(name,INSTR(name||'-','-',1,2)+1),10,'0') nulls first
票数 2
EN

Stack Overflow用户

发布于 2013-01-17 00:45:27

不确定mysql语法,但您可以在oracle中执行此操作:

代码语言:javascript
复制
select * from  <your_table>
order by substr(name, 5)
票数 0
EN

Stack Overflow用户

发布于 2013-01-17 01:21:20

在mssql中,查找问题的语法是:

代码语言:javascript
复制
select * from mytable order by substring(name,PATINDEX('%-%',name)+1,len(name)-PATINDEX('%-%',name))

SqlFiddle

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14363209

复制
相关文章

相似问题

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