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


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

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

    使用不同的比较语义比较两个字符的值,结果可能会变化。下表显示这种比较结果。通常,填充空格和不填充空格比较的结果是相同的。表中最后一个比较说明填充空格比较与不填充的差异。

    111111

    (* 注意字符中的空格)

    参考“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

  • 相关阅读:
    Algorithms
    STL学习笔记 set
    HttpContext.Current
    Luence初始与简单应用Document的增删改查.
    [深入浅出Cocoa]iOS程序性能优化
    spring.net结合普通三层(实现IOC 及AOP中的异常记录功能)
    VS版权信息插件——初试VS插件开发小记
    快速开发平台 Putdb WebBuilder 6.9
    ObjectiveC学习及iOS开发的准备
    Visual Studio 2012 Update 2 自制iso下载
  • 原文地址:https://www.cnblogs.com/liuning8023/p/2624220.html
Copyright © 2020-2023  润新知