Oracle查询要排序

时间:2018-04-20 04:18:42

标签: sql oracle sql-order-by

我的列中的值为[1_A CA 1_H 1_G CB AA AB HG],如果我使用order by子句,则输出结果为[1_A 1_G 1_H AA AB CA CB HG]。 我到现在为止尝试过这个

select distinct Plant_name from table_plants order by Plant_name

但我需要结果[AA AB CA CB HG 1_A 1_G 1_H]

3 个答案:

答案 0 :(得分:1)

一种方法是匹配并输入数字字符以跟随字母,然后按列排序。

SELECT *
FROM table_plants 
ORDER BY CASE 
        WHEN REGEXP_LIKE(Plant_name , '[0-9]')
            THEN 2
        ELSE 1
        END
    ,Plant_name;

Demo

如果您想考虑以数字开头的数字字符,可以将其设为'^[0-9]'

另外,如果你想使用像translate这样的非正则表达式函数,那么对于像你这样的情况,如果所有数字列中都存在下划线,它应该可以解决这个问题。

ORDER BY 
TRANSLATE(Plant_name,'x0123456789','x')

答案 1 :(得分:1)

这应该给出所需的输出:

select  Plant_name
from table_plants order by
regexp_substr(Plant_name, '^[[:alpha:]]') ,
regexp_substr(Plant_name, '^\d*'),
regexp_substr(Plant_name, '[[:alpha:]]', 1,2)  desc nulls last,
regexp_substr(Plant_name, '\d*', 1,2) desc,
regexp_substr(Plant_name, '[[:alpha:]]') desc ;

答案 2 :(得分:1)

SIGNASCII函数与REGEXP_REPLACE相结合,您可能会得到所需的结果:

select distinct Plant_name 
  from table_plants 
 order by regexp_replace(Plant_name,'^\d*');

PLANT_NAME
----------
AA
AB
CA
CB
HG
1_A
1_G
1_H

SQL Fiddle Demo

关于您的上次修改,您可以通过以下方式获得所需的结果:

select distinct Plant_name
  from table_plants 
 order by sign(50-ascii(Plant_name)),ascii(Plant_name),
          regexp_replace(Plant_name,'^\d*') desc;

PLANT_NAME
----------
AB
AA
CB
CA
HG
1_H
1_G
1_A

SQL Fiddle Demo 2