天天看点

第六十四章 SQL命令 ORDER BY(二)

第六十四章 SQL命令 ORDER BY(二)

示例

缓存查询

ORDER BY and CASE

ORDER BY和长全局引用

下面的示例按照<code>RowID</code>的反向顺序对记录进行排序:

下面两个示例展示了在<code>ORDER BY</code>子句中指定排序列的不同方法。

下面两个查询是等价的;

第一种方法使用列名作为排序项,第二种方法使用列号(选择项列表中项目的序号):

下面的示例按包含IRIS列表数据的字段进行排序。

因为IRIS列表是一个以格式化字符开始的编码字符串,所以本例使用<code>$LISTTOSTRING</code>来按实际字段数据值排序,而不是按列表元素编码:

动态SQL可以使用输入参数为<code>ORDER BY</code>子句提供文字值;

它不能使用输入参数来提供字段名、字段别名、字段号或排序关键字。

下面的动态SQL示例使用输入参数按名字对结果集记录进行排序:

以下基于游标的嵌入式SQL示例执行相同的操作:

<code>ORDER BY</code>子句中使用的每个字面值都会生成一个不同的缓存查询。

不对<code>ORDER BY</code>字面值执行字面值替换。

这是因为<code>ORDER BY</code>可以使用整数来指定列号。

更改这个整数将导致一个完全不同的查询。

可以使用<code>CASE</code>表达式定义一个通用查询,该查询可以根据提供的主机变量值进行排序。

例如,下面的示例可以根据名称或年龄排序,这取决于<code>var</code>的值:

下面的示例指定了两个<code>CASE</code>表达式。

它按任何情况计算为true进行排序。

如果两种情况都为真,则按国家排序,在国家内按城市排序:

<code>ASC</code>和<code>DESC</code>参数在<code>CASE END</code>关键字之后指定。

注意,在<code>CASE</code>表达式中必须根据列名指定字段。

在此上下文中,不能指定列别名或列号。

<code>ORDER BY ordering-item</code>的值不应该超过(大约)<code>400</code>到<code>500</code>个字符,这取决于<code>ordering-item</code>的数量和其他因素。

如果一个<code>ordering-item</code>值超过这个最大长度,则运行带有<code>ORDER BY</code>子句的查询可能会导致<code>SQLCODE -400</code>致命错误。

这是因为全局引用的最大编码长度有限制,这是一个固定的 IRIS系统限制。

为了防止这个问题,在作为<code>ORDER BY</code>子句基础的字段的排序规则设置中使用截断长度。

例如,以下查询超过了这个限制:

添加一个<code>maxlen</code>截断长度的排序函数允许该程序成功执行:

IRIS将字段的已整理值截断为<code>400</code>个字符。

请记住,如果字段内容在前<code>400</code>个字符内不是唯一的,则数据可能稍有混乱,但这种情况不太可能发生。

如果出现这种情况,可以尝试通过使用更大的值进行截断来避免显示无序的数据;

但是,如果值太大,将导致<code>&lt;SUBSCRIPT&gt;</code>错误。

还要注意,最大长度是全局引用的整个编码长度,包括全局名称的长度。

它不是简单的下标。