java - oracle中varchar的OrderBy

标签 java mysql oracle

下面是我的一个表(MyTABLE)的列数据(ORDER),

a
a.1
a.1.1
a.2.0
a.1.10
a.1.4
a.20.1
a.2.2.1
a.4.3.1
a.4
a.40

我想按以下方式订购,

a
a.1
a.1.1
a.1.4
a.2.0
a.2.2.1
a.4
a.4.3.1
a.20.1
a.40
b.*....(if any data present which has b prefixed etc.,)

我想知道这是否可以在获取结果时在数据库级别本身实现?如果没有,那么我们将如何在 Java 中完成它?

最佳答案

SQL Fiddle

Oracle 11g R2 架构设置:

CREATE TABLE MyTable ( name ) AS
          SELECT 'a' FROM DUAL
UNION ALL SELECT 'a.1.4' FROM DUAL
UNION ALL SELECT 'a.2.2.1' FROM DUAL
UNION ALL SELECT 'a.1.1' FROM DUAL
UNION ALL SELECT 'a.1' FROM DUAL
UNION ALL SELECT 'a.40' FROM DUAL
UNION ALL SELECT 'a.4' FROM DUAL
UNION ALL SELECT 'a.4.3.1' FROM DUAL
UNION ALL SELECT 'a.20.1' FROM DUAL
UNION ALL SELECT 'b.1' FROM DUAL
UNION ALL SELECT 'a.2.0' FROM DUAL

查询 1:

SELECT *
FROM   MyTable
ORDER BY
       REGEXP_SUBSTR( name, '[^.]+', 1, 1 ),
       TO_NUMBER( REGEXP_SUBSTR( name, '[^.]+', 1, 2 ) ) NULLS FIRST,
       TO_NUMBER( REGEXP_SUBSTR( name, '[^.]+', 1, 3 ) ) NULLS FIRST,
       TO_NUMBER( REGEXP_SUBSTR( name, '[^.]+', 1, 4 ) ) NULLS FIRST

Results :

|    NAME |
|---------|
|       a |
|     a.1 |
|   a.1.1 |
|   a.1.4 |
|   a.2.0 |
| a.2.2.1 |
|     a.4 |
| a.4.3.1 |
|  a.20.1 |
|    a.40 |
|     b.1 |

SQL Fiddle

MySQL 5.6 架构设置:

CREATE TABLE MyTable ( name VARCHAR(20) );

INSERT INTO MyTable
          SELECT 'a' FROM DUAL
UNION ALL SELECT 'a.1.4' FROM DUAL
UNION ALL SELECT 'a.2.2.1' FROM DUAL
UNION ALL SELECT 'a.1.1' FROM DUAL
UNION ALL SELECT 'a.1' FROM DUAL
UNION ALL SELECT 'a.40' FROM DUAL
UNION ALL SELECT 'a.4' FROM DUAL
UNION ALL SELECT 'a.4.3.1' FROM DUAL
UNION ALL SELECT 'a.20.1' FROM DUAL
UNION ALL SELECT 'b.1' FROM DUAL
UNION ALL SELECT 'a.2.0' FROM DUAL;

查询 1:

SELECT name
FROM   MyTable
ORDER BY
       SUBSTRING_INDEX( name, '.', 1 ),
       CASE WHEN SUBSTRING_INDEX( name, '.', 2 ) = SUBSTRING_INDEX( name, '.', 1 ) THEN -1 ELSE CAST( SUBSTRING_INDEX( SUBSTRING_INDEX( name, '.', 2 ), '.', -1 ) AS SIGNED ) END,
       CASE WHEN SUBSTRING_INDEX( name, '.', 3 ) = SUBSTRING_INDEX( name, '.', 2 ) THEN -1 ELSE CAST( SUBSTRING_INDEX( SUBSTRING_INDEX( name, '.', 3 ), '.', -1 ) AS SIGNED ) END,
       CASE WHEN SUBSTRING_INDEX( name, '.', 4 ) = SUBSTRING_INDEX( name, '.', 3 ) THEN -1 ELSE CAST( SUBSTRING_INDEX( SUBSTRING_INDEX( name, '.', 4 ), '.', -1 ) AS SIGNED ) END

Results :

|    name |
|---------|
|       a |
|     a.1 |
|   a.1.1 |
|   a.1.4 |
|   a.2.0 |
| a.2.2.1 |
|     a.4 |
| a.4.3.1 |
|  a.20.1 |
|    a.40 |
|     b.1 |

关于java - oracle中varchar的OrderBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32004129/

相关文章:

java - Maven 与 AspectJ - 例子?

database - 将字符串中的表达式转换为过程中的 bool 值 (PL/SQL) Oracle

java - 运行项目时出错

java regex - 搜索两次出现的搜索字符之间的空内容

java从文件夹中删除文件

mysql - Laravel 5.3 不在 AWS EC2 Ubuntu 16.04 中发送电子邮件

mysql - 如何从表中选择直到总数是一个特定的数字?

mysql - phpmyadmin|如何创建事件执行 2 个操作

sql - 列出一名员工的所有列(dept、emp、salgrade)

sql - 如何在 Select 上替换 Varchar2 中的特定字符