我有一个Oracle 10g数据库,并且有一个VARCHAR2(2000字符)列,可以将其命名为TEST,前面可以包含数字,例如:
test
1test
3test
当我打电话给“...由TEST asc订购”或简称“......按TEST订购”时
我按照
命令得到了结果test
1test
3test
但我想按照这样的顺序得到结果:
1test
3test
test
首先是编号插入,是否有实现此目的的方法?
答案 0 :(得分:5)
您的NLS_SORT设置为什么? (select sys_context('USERENV', 'NLS_SORT') from dual
)。如果是BINARY
,则排序顺序基于每个字符的数值,因此它取决于数据库字符集。如果它是其他东西,那么你可能想要覆盖它。
您可以通过修改该参数来更改数据库或会话级别的排序顺序,但您也可以针对单个查询更改它:
order by nlssort(test,'NLS_SORT=BINARY')
根据您的字符集,您可能需要尝试使用不同的值而不是BINARY
。您可以使用select value from v$nls_valid_values where parameter = 'SORT'
获取所有有效值的列表。但请注意NLS_SORT文档中提到的潜在性能影响。
nlssort()
函数已记录在案here。
答案 1 :(得分:4)
您可以使用regexp
替换之前的答案substr testorder by case when regexp_instr(test,'[0-9]+') = 1 then
to_number(regexp_substr(test,'[0-9]+'))
else
null
end nulls last, test
应该是这样的 - 你可以根据你的需要调整正则表达式。
答案 2 :(得分:3)
一种方式:
order by case when substr(test,1,1) between '0' and '9' then 1 else 2 end,
test
答案 3 :(得分:0)
使用substr工作正常。如果我们希望数字按升序排列,字符按降序排列。解决方法是什么。