第六十四章 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><SUBSCRIPT></code>错误。
还要注意,最大长度是全局引用的整个编码长度,包括全局名称的长度。
它不是简单的下标。