第128章 SQL函数 %SQLSTRING

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第128章 SQL函数 %SQLSTRING相关的知识,希望对你有一定的参考价值。

参考技术A 将值排序为字符串的排序规则函数。

%SQLSTRING 将表达式转换为按(区分大小写)字符串排序的格式。 %SQLSTRING 从字符串中去除尾随空格(空格、制表符等),然后在字符串的开头添加一个前导空格。这个附加的空格强制将 NULL 和数值作为字符串进行整理。从数字中删除前导零和尾随零。

因为 %SQLSTRING 将空格附加到所有值,所以它将 NULL 值整理为空格,字符串长度为 1 。 %SQLSTRING 将任何仅包含空格(空格、制表符等)的值整理为 SQL 空字符串( '' )。当 %SQLSTRING 将空格附加到空(零长度)字符串时,它会将空格加上空字符串的内部表示形式 $CHAR(0) 进行整理,从而导致字符串长度为 2 。

可选的 maxlen 参数在索引或整理时将表达式字符串截断为指定的字符数。例如,如果插入带有 maxlen 截断的字符串,则插入完整的字符串,并且可以通过 SELECT 语句检索;此字符串的全局索引被截断为指定长度。这意味着 ORDER BY 和比较操作仅评估截断的索引字符串。这种截断对于对超过下标的最大字符长度的字符串进行索引特别有用。使用 maxlen 参数,如果需要对长字段进行索引,可以使用截断长度参数。

%SQLSTRING 在转换表达式后执行 maxlen 截断;如果 maxlen 超过转换后的表达式的长度,则不添加填充。最大字符串长度为 3,641,144 个字符; maxlen 没有强制执行最大值。

可以使用 %SYSTEM.Util 类的 Collation() 方法在 ObjectScript 中执行相同的排序规则转换:

也可以使用 SQLSTRING() 方法调用从 ObjectScript 调用此函数:

这两种方法都支持 SQLSTRING 转换后的截断。请注意,截断长度必须包括附加的空白:

注意:要将系统范围的默认排序规则从 %SQLUPPER (不区分大小写)更改为 %SQLSTRING (区分大小写),请使用以下命令:

发出此命令后,必须清除索引,重新编译所有类,然后重建索引。不要在其他用户访问表的数据时重建索引。这样做可能会导致查询结果不准确。

以下查询在 WHERE 子句中使用 %SQLSTRING 来执行区分大小写的选择:

默认情况下, %STARTSWITH 字符串比较不区分大小写。此示例使用 %SQLSTRING 格式使此比较区分大小写。它返回所有以 “Al” 开头的名称(例如 Allen 、 Alton 等)。请注意,使用 %STARTSWITH 时,应将 %SQLSTRING 排序规则应用于语句的两侧。

以下示例使用带有字符串截断的 %SQLSTRING 来返回每个名称的前两个字符。请注意,字符串截断是 3 (不是 2 ),因为 %SQLSTRING 添加了前导空格。 ORDER BY 子句使用这个两个字符的字段将行放在一个粗略的排序顺序中:

此示例在不更改字母大小写的情况下返回截断的值。

以下示例将 %SQLSTRING 应用于子查询:

SQL基础教程(第2版)第8章 SQL高级处理:8-1 窗口函数

第8章 SQL高级处理:8-1 窗口函数

窗口函数可以进行排序、生成序列号等一般的聚合函数无法实现的高级操作。
理解PARTITION BYORDER BY这两个关键字的含义十分重要。


■ 什么是窗口函数

截至 2016 年 5 月,Oracle、SQL Server、DB2、PostgreSQL 的最新版本都已经支持了该功能,但是 MySQL 的5.7版本还是不支持窗口函数
OLAP OnLine Analytical Processing 的简称,意思是对数据库数据进行实时分析处理。 例如,市场分析、创建财务报表、创建计划等日常性商务工作。
窗口函数就是为了实现 OLAP 而添加的标准 SQL 功能。在Oracle和 SQL Server中称为分析函数。

■ 窗口函数的语法


窗口函数大体可以分为以下两种。

① 能够作为窗口函数的聚合函数( SUMAVGCOUNTMAXMIN
RANKDENSE_RANKROW_NUMBER 专用窗口函数


■ 语法的基本使用方法——使用RANK函数

正如其名称所示, RANK 是用来计算记录排序的函数。

例如,对于之前使用过的 Product 表中的 8 件商品,让我们根据不同的商品种类(product_type),按照销售单价(sale_price)从低到高的顺序排序,结果如下所示。

PARTITION BY 在横向上对表进行分组,而 ORDER BY决定了纵向排序的规则。

ORDER BY 能够指定按照哪一列、何种顺序进行排序。可以通过关键字ASC/DESC 来指定升序和降序。
省略该关键字时会默认按照 ASC,也就是升序进行排序。

通过 PARTITION BY 分组后的记录集合称为窗口。此处的窗口并非“窗户”的意思,而是代表范围

■ 无需指定PARTITION BY

使用窗口函数时起到关键作用的是 PARTITION BY GROUP BY
其中, PARTITION BY 并不是必需的,也就是将整个表作为一个大的窗口来使用。

■ 专用窗口函数的种类

RANK函数
计算排序时,如果存在相同位次的记录,则会跳过之后的位次。
例)有 3 条记录排在第 1 位时:1 位、1 位、1 位、4 位……
DENSE_RANK函数
同样是计算排序,即使存在相同位次的记录,也不会跳过之后的位次。
例)有 3 条记录排在第 1 位时:1 位、1 位、1 位、2 位……
ROW_NUMBER函数
赋予唯一的连续位次。
例)有 3 条记录排在第 1 位时:1 位、2 位、3 位、4 位……

除此之外,DBMS 还提供了各自特有的窗口函数。上述 3 个函数(对于支持窗口函数的 DBMS 来说)在所有的 DBMS 中都能够使用。

■ 窗口函数的适用范围

窗口函数只能书写在一个特定的位置,这个位置就是 SELECT 子句之中

反过来说,就是这类函数不能在WHERE 子句或者 GROUP BY 子句中使用。

SELECT 子句之外“使用窗口函数是没有意义的”,所以在语法上才会有这样的限制。 

■ 作为窗口函数使用的聚合函数

所有的聚合函数都能用作窗口函数,其语法和专用窗口函数完全相同。

在按照时间序列的顺序,计算各个时间的销售额总额等的时候,通常都会使用这种称为累计的统计方法。
使用其他聚合函数时的操作逻辑也和本例相同。例如,使用 AVG 来代替 SELECT 语句中的 SUM(代码清单 8-5)。

像这样以“自身记录(当前记录)”作为基准进行统计,就是将聚合函数当作窗口函数使用时的最大特征。

■ 计算移动平均

窗口函数就是将表以窗口为单位进行分割,并在其中进行排序的函数。

其实其中还包含在窗口中指定更加详细的汇总范围的备选功能,该备选功能中的汇总范围称为框架
其语法如代码清单 8-6 所示,需要在 ORDER BY 子句之后使用指定范围的关键字。

指定框架(汇总范围)

这里我们使用了 ROWS(“行”)和 PRECEDING(“之前”)两个关键
字,将框架指定为“截止到之前 ~ 行”,因此“ROWS 2 PRECEDING

就是将框架指定为“截止到之前 2 行”,也就是将作为汇总对象的记录限
定为如下的“最靠近的 3 行”。
自身(当前记录)
之前1行的记录
之前2行的记录
也就是说,由于框架是根据当前记录来确定的,因此和固定的窗口不同,其范围会随着当前记录的变化而变化。
这样的统计方法称为移动平均moving average)。由于这种方法在希望实时把握“最近状态”时非常方便,因此常常会应用在对股市趋势的实时跟踪当中。
使用关键字 FOLLOWING(“之后”)替换 PRECEDING,就可以指定“截止到之后 行”作为框架了。

将当前记录的前后行作为汇总对象

具体来说,就是将如下 行作为汇总对象来进行计算

之前1行的记录
自身(当前记录)
之后1行的记录


■ 两个ORDER BY

 OVER 子句中的 ORDER BY 只是用来决定窗口函数按照什么样的顺序进行计算的,对结果的排列顺序并没有影响。

那么,如何才能让记录切实按照 ranking 列的升序进行排列呢?
答案非常简单。那就是在 SELECT 语句的最后,使用 ORDER BY子句进行指定(代码清单 8-9)。这样就能保证 SELECT 语句的结果中
记录的排列顺序了,除此之外也没有其他办法了。

以上是关于第128章 SQL函数 %SQLSTRING的主要内容,如果未能解决你的问题,请参考以下文章

第109章 SQL函数 POSITION

SQL基础教程(第2版)第6章 函数谓词CASE表达式:6-1 函数

第144章 SQL函数 TO_DATE(二)

SQL基础教程(第2版)第6章 函数谓词CASE表达式:6-2 谓词

MySQL必知应会-第11章-使用数据处理函数

SQL基础教程(第2版)第6章 函数谓词CASE表达式:练习题