http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions001.htm#autoId6
本文内容
- GREATEST
- LEAST
比较函数根据值的字符集确定最大或最小值。
GREATEST(expr1,expr2,…,exrpn)
GREATEST 返回表达式列表中的最大值。Oracle 数据库用第一个表达式确定返回类型。若第一个表达式是数字,则 Oracle 在比较前用最高数字优先(highest numeric precedence)来确定参数,隐式把其他参数转换成该类型,并返回该类型。若第一个表达式为非数字,则之后的表达式,在比较前,隐式转换成第一个表达式的类型。
Oracle 数据库用非填充比较语义(nonpadded comparison semantics)比较每个表达式。默认的是二进制比较。若会话参数 NLS_COMP 设置为 LINGUISTIC,参数 NLS_SORT 已设置,但不是 BINARY,则是语言比较。字符比较是基于数据库字符集中字符的数字编码,并把字符串作为一个字节序列,而不是按字符。若该函数返回值是字符数据,那么,如果第一个表达式是字符类型,返回类型是 VARCHAR2,若第一个表达式是国际化字符类型,返回类型是 NVARCHAR2。
示例 1:演示选择字符串的最大值。
SQL> SELECT GREATEST('HARRY', 'HARRIOT', 'HAROLD') "Greatest" FROM DUAL;
Greatest
--------
HARRY
SQL>
LEAST(expr1,expr2,…,exprn)
LEAST 返回表达式列表的最小值。比较前,第一个表达式后的所有表达式被隐式转换成第一个表达式的类型。Oracle 数据库用非填充比较语义(nonpadded comparison semantics)比较每个表达式。若函数返回值是字符数据,则它的类型总是 VARCHAR2。
示例 2:演示选择字符串的最小值。
SQL> SELECT LEAST('HARRY', 'HARRIOT', 'HAROLD') "LEAST" FROM DUAL;
LEAST
------
HAROLD
SQL>
备注
填充空格比较语义(blank-padded comparison semantics)和非填充比较语义(nonpadded comparison semantics)
比如,CHAR 类型的值,Oracle 数据库使用“填充空格比较语义”来比较。而 VARCHAR2 类型,则使用“非填充比较语义”。
字符比较规则
字符(字母和数字)值的比较是基于下面两个来衡量:
- 二进制或语言排序(Binary or linguistic sorting)
- 填充空格或非填充比较语义(Blank-padded or nonpadded comparison semantics)
二进制或语言排序
在二进制比较中,这是默认的,Oracle 比较字符串是根据数据库字符集中字符数字编码的连接值。若一个字符在字符集中的数字值比另一个字符大,则这个字符就比另一个大。Oracle 认为空格比任何字符都小。事实上,在大多数字符集也是如此。
下面是一般的字符集:
- 7-bit ASCII (American Standard Code for Information Interchange)
- EBCDIC Code (Extended Binary Coded Decimal Interchange Code)
- ISO 8859/1 (International Standards Organization)
- JEUC Japan Extended UNIX
如果数字编码的二进制序列与你要比较的字符语言序列不匹配,那么语言比较很有用。若设置了 NLS_SORT 参数,不是 BINARY,并且 NLS_COMP 参数设置为 LINGUISTIC,则就使用了语言比较。在语言排序中,所有的 SQL 排序和比较都是基于 NLS_SORT 指定的语言规则。
填充空格或非填充比较语义
用“填充空白语义”,若两个值的长度不同,则 Oracle 首先将空白添加到较短的那个,这样他们的长度就相同了。然后,Oracle 逐个字符比较,直到第一个不同的字符。较大字符的值被认为较大。若两个值没有不同的字符,则认为相等。这条规则意味着,如果它们的不同仅在尾部空格的数量,那么这两个就是相等的。Oracle 仅当比较两个值是 CHAR、NCHAR、文本字面义,或 USER 函数的返回值时,才使用“填充空白比较语义”。
用“非填充语义”,Oracle 不填充,逐个字符比较,直到第一个不同的字符。较大字符的值被认为较大。r若两个长度不同的值直到较短的那个都相同(一个是另一个的字串),则较长的那个被认为较大。若两个长度相等的值没有不同的字符,则认为相等。无论何时,比较的值是 VARCHAR2 或 NVARCHAR2 类型时, Oracle 使用“非填充比较语义”。
使用不同的比较语义比较两个字符的值,结果可能会变化。下表显示这种比较结果。通常,填充空格和不填充空格比较的结果是相同的。表中最后一个比较说明填充空格比较与不填充的差异。
(* 注意字符中的空格)
参考“Oracle 数据类型”http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CDEFDGFE
参考“数据类型比较规则”http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements002.htm#sthref299