Oracle nls_sort和nlssort 排序功能简述

本文介绍了Oracle数据库中的多种排序方法,包括按拼音、笔画、部首等进行排序的具体操作,并提供了SQL示例。此外还展示了如何通过子串提取来实现复合字段的定制化排序。

(1)ALTER SESSION SET NLS_SORT=''; 排序影响整个会话

 

Oracle9i之前,中文是按照二进制编码进行排序的。

 

  在oracle9i中新增了按照拼音、部首、笔画排序功能。设置NLS_SORT值

 

  SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序

 

  SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序

 

  SCHINESE_PINYIN_M 按照拼音排序

oracle9i中新增了按照拼音、部首、笔画排序功能

拼音 SELECT * FROM TEAM ORDER BY NLSSORT(队名,'NLS_SORT = SCHINESE_PINYIN_M')

笔划 SELECT * FROM TEAM ORDER BY NLSSORT(队名,'NLS_SORT = SCHINESE_STROKE_M')

部首 SELECT * FROM TEAM ORDER BY NLSSORT(队名,'NLS_SORT = SCHINESE_RADICAL_M')

 

 

(2)又如在视图中查询获取道路列表:

 

sSql = string.Format("select distinct({0}) from {1} order by nlssort({0},'NLS_SORT=SCHINESE_PINYIN_M')", sFieldDL, sViewDL);

 

(3)又如

 

一个表中的数据是这样的:

PROJECTNO

-----------------------

钦市PC2010-5

钦市PC2011-6

钦市PC2011-40

钦南PC2011-5

钦南GC2011-5

钦市PC2011-5(还有很多)数据前2个字是市区名,后面的是文件名“-”后面的是第几号文件,我想知道如何用SQL语句将他们升序排序,需要先排列市区名,市区名相同了在升序排列后面的文件名,文件名相同了在排列后面的文件编号名。

注意:单单用select projectno from dual order by projectno asc 是不能实现的。

 

可使用

select projectno from dual order by substring(projectno ,1,2) asc ,substring(projectno ,3,6) asc ,substring(projectno ,9,2) asc

 

文献出处:http://blog.sina.com.cn/s/blog_5fd47cff0100xy8p.html

Oracle SQL 中使用 `NLSSORT` 函数进行中文排序时,如果后续的 `BUILDING_AREA DESC` 排序失效,通常是因为 `ORDER BY` 子句中多个排序字段的优先级或表达方式存在问题。具体来说,当使用 `NLSSORT` 函数对某一字段进行排序时,如果没有正确地将多个排序条件组合在一起,可能会导致数据库仅识别第一个排序条件,而忽略后续的排序字段。 ### 原因分析 1. **排序优先级问题**:`ORDER BY` 子句中的多个排序字段是按照书写顺序依次进行排序的。如果第一个排序字段的唯一性不足以区分所有记录,则会使用第二个字段进行进一步排序。然而,当 `NLSSORT` 被误用或者其返回值被当作独立的排序维度时,可能会掩盖后续字段的排序效果。 2. **函数影响排序行为**:`NLSSORT` 是一个用于多语言排序的函数,它会影响排序操作的底层比较机制。如果该函数的应用范围没有被明确限制,可能会导致优化器错误地处理后续的排序逻辑。 3. **语法结构问题**:在某些情况下,如果 `ORDER BY` 子句的结构不清晰或存在歧义,例如未使用括号明确指定每个排序字段的表达式,也可能导致排序顺序不符合预期。 ### 解决方案 为了确保 `NLSSORT(RESOURCE_NAME, 'NLS_SORT=SCHINESE_PINYIN_M')` `BUILDING_AREA DESC` 都能正确生效,应该将两个排序条件明确写入 `ORDER BY` 子句,并确保它们之间的关系是并列的。正确的 SQL 语句示例如下: ```sql SELECT * FROM your_table ORDER BY NLSSORT(RESOURCE_NAME, 'NLS_SORT=SCHINESE_PINYIN_M'), BUILDING_AREA DESC; ``` 此语句表示首先根据 `RESOURCE_NAME` 使用中文拼音排序规则进行升序排序,然后在同一拼音排序结果的基础上,对 `BUILDING_AREA` 字段进行降序排序。 此外,还可以通过以下方式进行验证调试: - **检查索引使用情况**:确认是否有适当的索引支持这种排序方式,尤其是在大数据量表中,缺少合适的索引可能导致性能问题。 - **测试子查询**:可以尝试将 `NLSSORT` 的结果作为虚拟列引入,再进行排序,以排除函数直接作用于 `ORDER BY` 的潜在问题。 - **使用别名简化表达式**:在某些复杂场景下,可以通过 `SELECT` 子句生成别名,然后在 `ORDER BY` 中引用该别名进行排序,提高可读性维护性。 ### 示例代码 ```sql -- 使用别名简化排序表达式 SELECT RESOURCE_NAME, BUILDING_AREA FROM your_table ORDER BY NLSSORT(RESOURCE_NAME, 'NLS_SORT=SCHINESE_PINYIN_M'), BUILDING_AREA DESC; -- 或者使用子查询形式 SELECT * FROM ( SELECT *, NLSSORT(RESOURCE_NAME, 'NLS_SORT=SCHINESE_PINYIN_M') AS sort_key FROM your_table ) t ORDER BY sort_key, BUILDING_AREA DESC; ``` 以上方法可以有效解决 `NLSSORT` 排序后导致的后续字段排序无效的问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值