当前面包含数字时,10g订购varchar列

时间:2011-03-10 09:46:41

标签: oracle sql-order-by varchar2

我有一个Oracle 10g数据库,并且有一个VARCHAR2(2000字符)列,可以将其命名为TEST,前面可以包含数字,例如:

test
1test
3test

当我打电话给“...由TEST asc订购”或简称“......按TEST订购”时

我按照

命令得到了结果
test
1test
3test

但我想按照这样的顺序得到结果:

1test
3test
test

首先是编号插入,是否有实现此目的的方法?

4 个答案:

答案 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 test
order 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工作正常。如果我们希望数字按升序排列,字符按降序排列。解决方法是什么。