5

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

test
1test
3test

当我调用“... order by TEST asc”或只是“... order by TEST”

我得到的结果像

test
1test
3test

但我想得到这样的结果:

1test
3test
test

所以先编号插入,有没有办法做到这一点?

4

4 回答 4

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()功能在此处记录。

于 2011-03-10T10:18:00.700 回答
4

您可以用正则表达式替换以前的答案 substr 测试

order by case when regexp_instr(test,'[0-9]+') = 1 then 
   to_number(regexp_substr(test,'[0-9]+')) 
else 
   null 
end nulls last, test

它应该是这样的——你可以根据你的需要调整正则表达式。

于 2011-03-10T10:17:53.637 回答
3

单程:

order by case when substr(test,1,1) between '0' and '9' then 1 else 2 end,
         test
于 2011-03-10T09:49:55.923 回答
0

使用 substr 工作正常。如果我们希望数字按升序排列,字符按降序排列。解决方法是什么。

于 2017-10-25T07:25:47.913 回答