下面是我的一个表(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 中完成它?
最佳答案
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 |
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/