您的位置:首页 > 数据库 > Oracle

Oracle 11g Release 1 (11.1) 单行函数——比较函数

2012-08-05 21:15 471 查看
http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions001.htm#autoId6

 

本文内容

GREATEST
LEAST
 

比较函数根据值的字符集确定最大或最小值。

 

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仅当比较两个值是CHARNCHAR、文本字面义,或USER函数的返回值时,才使用“填充空白比较语义”。

用“非填充语义”,Oracle不填充,逐个字符比较,直到第一个不同的字符。较大字符的值被认为较大。r若两个长度不同的值直到较短的那个都相同(一个是另一个的字串),则较长的那个被认为较大。若两个长度相等的值没有不同的字符,则认为相等。无论何时,比较的值是VARCHAR2NVARCHAR2类型时,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

 



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航