我有一个 Oracle 10g 数据库并有一个 VARCHAR2(2000 字符)列,可以将其命名为 TEST,其中可以包含前面的数字,例如:
test
1test
3test
当我调用“... order by TEST asc”或只是“... order by TEST”
我得到的结果像
test
1test
3test
但我想得到这样的结果:
1test
3test
test
所以先编号插入,有没有办法做到这一点?
我有一个 Oracle 10g 数据库并有一个 VARCHAR2(2000 字符)列,可以将其命名为 TEST,其中可以包含前面的数字,例如:
test
1test
3test
当我调用“... order by TEST asc”或只是“... order by TEST”
我得到的结果像
test
1test
3test
但我想得到这样的结果:
1test
3test
test
所以先编号插入,有没有办法做到这一点?
您的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()
功能在此处记录。
您可以用正则表达式替换以前的答案 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
它应该是这样的——你可以根据你的需要调整正则表达式。
单程:
order by case when substr(test,1,1) between '0' and '9' then 1 else 2 end,
test
使用 substr 工作正常。如果我们希望数字按升序排列,字符按降序排列。解决方法是什么。