博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle 11g Release 1 (11.1) 单行函数——比较函数
阅读量:7096 次
发布时间:2019-06-28

本文共 2189 字,大约阅读时间需要 7 分钟。

 

本文内容

  • 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 使用“非填充比较语义”。

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

(* 注意字符中的空格)

参考“Oracle 数据类型”

参考“数据类型比较规则”

 

o_r_%E7%BF%BB%E8%AF%91.jpg

o_%E5%8E%9F%E5%88%9B.jpg

转载地址:http://pfxql.baihongyu.com/

你可能感兴趣的文章
js版本的(广、深)度优先搜索
查看>>
百度AI3.0让传统质检升级为人工智能,下一个失业的是谁?
查看>>
iOS多线程NSOperation篇
查看>>
关于B站的弹幕集成
查看>>
本人开源项目 Lu-Rpc
查看>>
echart地图使用经验-地图变形和添加数据
查看>>
牵引力教育告诉你,自学设计的学员为什么90%都学不会?
查看>>
Teambition X 2019 校招
查看>>
使用Puppeteer轻松爬取网易云音乐、QQ音乐的精品歌单
查看>>
高并发-「抢红包案例」之一:SSM环境搭建及复现红包超发问题
查看>>
iOS 多国语言本地化与App内语言切换(Swift)
查看>>
window下git多账户管理
查看>>
阿里云服务器部署LAMP
查看>>
使用jMeter构造大量并发的随机HTTP请求
查看>>
做一个帮你快速调试UI参数的Android插件
查看>>
经典的 Top K 问题,你真的懂了么?
查看>>
ionic3 相机和相册获取图片
查看>>
JavaScript 基础(2)- 操作符、字符串、数组
查看>>
Spark log4j 日志配置详解
查看>>
Java学习:JVM是什么?
查看>>