Oracle 11g Release 1 (11.1) 单行函数——比较函数
2012-08-05 21:15
471 查看
本文内容
GREATESTLEAST
GREATEST(expr1,expr2,…,exrpn)
GREATEST返回表达式列表中的最大值。Oracle数据库用第一个表达式确定返回类型。若第一个表达式是数字,则Oracle在比较前用最高数字优先(highestnumericprecedence)来确定参数,隐式把其他参数转换成该类型,并返回该类型。若第一个表达式为非数字,则之后的表达式,在比较前,隐式转换成第一个表达式的类型。Oracle数据库用非填充比较语义(nonpaddedcomparisonsemantics)比较每个表达式。默认的是二进制比较。若会话参数NLS_COMP设置为LINGUISTIC,参数NLS_SORT已设置,但不是BINARY,则是语言比较。字符比较是基于数据库字符集中字符的数字编码,并把字符串作为一个字节序列,而不是按字符。若该函数返回值是字符数据,那么,如果第一个表达式是字符类型,返回类型是VARCHAR2,若第一个表达式是国际化字符类型,返回类型是NVARCHAR2。
示例1:演示选择字符串的最大值。
[code][code]SQL>SELECTGREATEST('HARRY','HARRIOT','HAROLD')"Greatest"FROMDUAL;
Greatest
--------
HARRY
SQL>
[/code]
[/code]
LEAST(expr1,expr2,…,exprn)
LEAST返回表达式列表的最小值。比较前,第一个表达式后的所有表达式被隐式转换成第一个表达式的类型。Oracle数据库用非填充比较语义(nonpaddedcomparisonsemantics)比较每个表达式。若函数返回值是字符数据,则它的类型总是VARCHAR2。示例2:演示选择字符串的最小值。
[code]
[code]SQL>SELECTLEAST('HARRY','HARRIOT','HAROLD')"LEAST"FROMDUAL;
LEAST
------
HAROLD
SQL>
[/code]
[/code]
备注
填充空格比较语义(blank-paddedcomparisonsemantics)和非填充比较语义(nonpaddedcomparisonsemantics)比如,CHAR类型的值,Oracle数据库使用“填充空格比较语义”来比较。而VARCHAR2类型,则使用“非填充比较语义”。
字符比较规则
字符(字母和数字)值的比较是基于下面两个来衡量:
二进制或语言排序(Binaryorlinguisticsorting)
填充空格或非填充比较语义(Blank-paddedornonpaddedcomparisonsemantics)
二进制或语言排序
在二进制比较中,这是默认的,Oracle比较字符串是根据数据库字符集中字符数字编码的连接值。若一个字符在字符集中的数字值比另一个字符大,则这个字符就比另一个大。Oracle认为空格比任何字符都小。事实上,在大多数字符集也是如此。
下面是一般的字符集:
7-bitASCII(AmericanStandardCodeforInformationInterchange)
EBCDICCode(ExtendedBinaryCodedDecimalInterchangeCode)
ISO8859/1(InternationalStandardsOrganization)
JEUCJapanExtendedUNIX
如果数字编码的二进制序列与你要比较的字符语言序列不匹配,那么语言比较很有用。若设置了NLS_SORT参数,不是BINARY,并且NLS_COMP参数设置为LINGUISTIC,则就使用了语言比较。在语言排序中,所有的SQL排序和比较都是基于NLS_SORT指定的语言规则。
填充空格或非填充比较语义
用“填充空白语义”,若两个值的长度不同,则Oracle首先将空白添加到较短的那个,这样他们的长度就相同了。然后,Oracle逐个字符比较,直到第一个不同的字符。较大字符的值被认为较大。若两个值没有不同的字符,则认为相等。这条规则意味着,如果它们的不同仅在尾部空格的数量,那么这两个就是相等的。Oracle仅当比较两个值是CHAR、NCHAR、文本字面义,或USER函数的返回值时,才使用“填充空白比较语义”。
用“非填充语义”,Oracle不填充,逐个字符比较,直到第一个不同的字符。较大字符的值被认为较大。r若两个长度不同的值直到较短的那个都相同(一个是另一个的字串),则较长的那个被认为较大。若两个长度相等的值没有不同的字符,则认为相等。无论何时,比较的值是VARCHAR2或NVARCHAR2类型时,Oracle使用“非填充比较语义”。
使用不同的比较语义比较两个字符的值,结果可能会变化。下表显示这种比较结果。通常,填充空格和不填充空格比较的结果是相同的。表中最后一个比较说明填充空格比较与不填充的差异。
(*注意字符中的空格)
参考“Oracle数据类型”
参考“数据类型比较规则”