Oracle SQL函数-NLSSORT
Syntax
用途:
NLSSORT返回字符值char的排序规则键和显式或隐式指定的排序规则。排序规则键是一个用于根据指定的排序规则对char进行排序的字节字符串。排序规则键的属性是:按二进制比较由给定的排序规则生成的两个排序键的相互排序和按给定的排序规则比较源字符值的相互排序相同。
char和 'nlsparam' 可以是char、varchar2、nchar或NVARCHAR2中的任何类型。
'nlsparam' 的值必须具有形式 'NLS_SORT = collation'
其中collation是语言排序规则或BINARY。NLSSORT使用指定的排序规则生成排序规则键。如果省略'nlsparam',则此函数使用参数char的派生排序规则。如果指定BINARY,则此函数将char值本身转换为raw返回,并可能按下面的说明截断。
如果指定'nlsparam',则可以将后缀“_ai”附加到语言排序规则名称中,以请求不区分重音的排序规则,或者“_ci”请求不区分大小写的排序规则。有关重音和不区分大小写排序的详细信息,请参阅《 Oracle Database Globalization Support Guide》。不建议对 ORDER BY 查询子句使用不区分重音或不区分大小写的排序规则,因为它会导致不确定的排序顺序。
返回的排序键是 RAW 类型。给定排序规则对给定char值产生的排序规则键的长度可能超过NLSSORT返回的 RAW 的最大长度。在这种情况下,NLSSORT的行为取决于初始化参数 MAX_STRING_SIZE的值。如果 MAX_STRING_SIZE = EXTENDED,则返回值的最大长度为32767字节。如果排序规则键超出此限制,则函数将失败,并出现错误“ORA-12742:无法创建排序规则键”。如果短输入字符串包含的Unicode字符百分比很高且分解率很高,则也可能会报告此错误。
如果 MAX_STRING_SIZE = STANDARD,则返回值的最大长度为2000字节。如果返回值超出限度,那么NLSSORT将计算char的最大前缀或初始子字符串的排序规则键,以便计算结果不超过最大长度。对于单语排序,例如FRENCH,前缀长度通常为1000个字符。对于多语言排序,例如GENERIC_M,前缀通常为500个字符。对于Unicode Collation Algorithm (UCA)排序,例如UCA0610_DUCET,前缀通常为285个字符。根据排序规则和char中包含的字符,准确的长度可能会更低或更高。
当 MAX_STRING_SIZE = STANDARD时的行为意味着,如果两个字符值的排序键(NLSSORT结果)在前缀上没有差异,即使它们在某些进一步的字符位置上可能有所不同,则将其比较以发现语言顺序是相等的。由于隐式使用NLSSORT函数查找比较条件、between条件、in条件、order by、group by和count(distinct)的语言顺序,因此这些操作可能返回仅对长字符值近似的结果。如果您希望确保这些操作的结果是准确的,那么迁移数据库以使用MAX_STRING_SIZE = EXTENDED。
此函数不直接支持CLOB数据。但是,CLOB可以通过隐式数据转换作为参数传入。
实例
此函数可用于指定基于语言排序序列的排序和比较操作,而不是基于字符串的二进制值。下面的示例创建一个包含两个值的测试表,并显示如何通过nlsort函数对返回的值进行排序:
CREATE TABLE test (name VARCHAR2(15)); INSERT INTO test VALUES ('Gaardiner'); INSERT INTO test VALUES ('Gaberd'); INSERT INTO test VALUES ('Gaasten'); SELECT * FROM test ORDER BY name; NAME --------------- Gaardiner Gaasten Gaberd SELECT * FROM test ORDER BY NLSSORT(name, 'NLS_SORT = XDanish'); NAME --------------- Gaberd Gaardiner Gaasten
下面的示例说明如何在比较操作中使用NLSSORT函数:
SELECT * FROM test WHERE name > 'Gaberd' ORDER BY name; no rows selected SELECT * FROM test WHERE NLSSORT(name, 'NLS_SORT = XDanish') > NLSSORT('Gaberd', 'NLS_SORT = XDanish') ORDER BY name; NAME --------------- Gaardiner Gaasten
如果在使用相同语言排序序列的比较操作中经常使用NLSSORT,那么考虑使用这种更有效的替代方法:将 NLS_COMP 参数(对于数据库或当前会话)设置为LINGUISTIC,并将会话的NLS_SORT参数设置为所需的排序序列。在当前会话期间,Oracle数据库将默认使用该排序顺序进行所有排序和比较操作:
ALTER SESSION SET NLS_COMP = 'LINGUISTIC'; ALTER SESSION SET NLS_SORT = 'XDanish'; SELECT * FROM test WHERE name > 'Gaberd' ORDER BY name; NAME --------------- Gaardiner Gaasten