Oracle中文、数字混杂字段的排序

本文详细介绍了如何在Oracle数据库中对包含中文和数字的字段进行排序,包括使用NLSSORT()函数改变排序规则以及使用TRANSLATE()函数剔除非数字字符。

 对Oracle中中文、数字混杂形式的字段进行排序的方法:

例如:

order by NLSSORT(字段名,'NLS_SORT = SCHINESE_PINYIN_M'), to_number(translate(字段名, '0123456789' || 字段名, '0123456789'))

 

NLSSORT() 函数:

如果数据库字符集选用的是ZH16GBK,那么使用order by默认是按照汉字的“二进制编码”顺序进行排序的。

可以使用NLSSORT()函数可以改变Oralce 对汉字的排序规则,排序规则如下(前三条对简体中文进行排序,后两条对繁体中文进行排序):

1. SCHINESE_RADICAL_M

    简体中文按照第一顺序是“部首”、第二顺序是“笔画数”进行排序。

2. SCHINESE_STROKE_M

    简体中文按照第一顺序“笔画数”、是第二顺序是“部首”进行排序。

3. SCHINESE_PINYIN_M

    简体中文按照拼音进行排序。上例中即对简体汉字按照拼音进行排序。

4. TCHINESE_RADICAL_M

    繁体中文按照第一顺序是“部首”、第二顺序是“笔画数”进行排序。

5. TCHINESE_STROKE_M

    繁体中文按照第一顺序是“笔画数”、第二顺序是“部首”进行排序。

 

TRANSLATE() 函数:

语法:TRANSLATE(char, from, to)

用法:将char中出现在from中的每个字符替换为to中的相应字符,若from比to字符串长,那么在from中比to中多出的字符将会被删除。三个参数中有一个是空,返回值也将是空值。

该函数可用于剔除字段中的汉字,例:

select TRANSLATE('例1213','0123456789'||'例1213','0123456789') as RESULT from dual;
  RESULT
------------
  1213

分析:该语句要将 char--'例1213' 中出现在 from--'0123456789例1213' 中的字符替换为 to--'0123456789' 中的字符,根据 from、to 的对应关系,将 char 中的 0替换成0、1替换成1、...9替换成9,即 char 中的数字不变,又 from 比 to 长,则 from 中比 to 中多出的字符将被删除,即删除 char 中的汉字。

 

 

Oracle 数据库中,`ORDER BY` 子句支持对多个字段进行排序,其语法形式为在 `SELECT` 语句中使用 `ORDER BY` 后面依次列出多个排序字段,并指定每个字段排序方式(升序 `ASC` 或降序 `DESC`),还可以指定 `NULLS FIRST` 或 `NULLS LAST` 来控制空值在排序中的位置[^4]。 例如,假设有一个包含学生信息的表 `students`,其中包括 `name`(姓名)、`age`(年龄)和 `score`(成绩)字段,若希望按年龄升序排序,年龄相同的情况下再按成绩降序排序,则可以使用如下 SQL 语句: ```sql SELECT name, age, score FROM students ORDER BY age ASC, score DESC; ``` 在多字段排序过程中,Oracle 会优按照第一个字段进行排序;如果第一个字段存在相同值,则继续根据第二个字段进行排序,依此类推,直到所有指定字段都比较完毕[^2]。 此外,在实际应用中,如果 `ORDER BY` 与 `GROUP BY` 一起使用,则需要注意:`ORDER BY` 中出现的字段必须在 `GROUP BY` 子句中列出,或者被包含在聚合函数中。例如,若查询中使用了 `GROUP BY name`,而 `SELECT` 列表中包含未被聚合的 `stu_no` 字段,则 `ORDER BY` 中若涉及 `stu_no` 字段,该字段也必须出现在 `GROUP BY` 子句中[^3]。 对于中文字段排序,由于 Oracle 默认的排序规则基于 Unicode 编码,可能导致排序结果不符合拼音、部首或笔画顺序等中文习惯。为解决这一问题,可以通过在数据库会话级别设置 `NLS_SORT` 和 `NLS_COMP` 参数来指定中文排序规则。例如,设置 `NLS_SORT=SCHINESE` 可以实现按拼音排序,设置 `NLS_SORT=SCHINESE_RADICAL` 可以按部首排序,而 `NLS_SORT=SCHINESE_STROKE` 则表示按笔画排序[^1]。 示例设置语句如下: ```sql ALTER SESSION SET NLS_SORT=SCHINESE; ALTER SESSION SET NLS_COMP=LINGUISTIC; ``` 之后再执行包含中文字段排序的查询语句,即可获得符合中文习惯的排序结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值