我的列中的值为[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]
。
答案 0 :(得分:1)
一种方法是匹配并输入数字字符以跟随字母,然后按列排序。
SELECT *
FROM table_plants
ORDER BY CASE
WHEN REGEXP_LIKE(Plant_name , '[0-9]')
THEN 2
ELSE 1
END
,Plant_name;
如果您想考虑以数字开头的数字字符,可以将其设为'^[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)
将SIGN
和ASCII
函数与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
关于您的上次修改,您可以通过以下方式获得所需的结果:
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