Interbase中如何创建同时包含ASC、DESC排序的复合索引?
Interbase 单索引混合升降序创建方法
首先明确版本规则限制:
- Interbase 7.5及更早版本,不支持在同一个索引中给不同字段单独设置升/降序方向。默认创建的普通索引所有字段统一为升序,加
DESCENDING关键字创建的索引所有字段统一为降序,这就是前两次执行建索引语句得到全升、全降结果的原因。 - 你之前写的
[DATUM] DESC这类写法是Access、SQL Server等其他数据库的语法,Interbase既不识别方括号包裹字段名的写法,也不支持老版本里的字段级排序声明,所以语句无法生效。
对应版本的实现方式
Interbase 2009 及以上版本
从2009版开始Interbase原生支持字段级排序配置,建索引时不需要加方括号,直接在对应字段后标注排序方向即可,正确语句如下:
CREATE INDEX AMUT_DAT ON ARTIKMUT(DATUM DESC, ARTIKEL ASC, KODE ASC);
执行后直接得到DATUM降序、ARTIKEL和KODE升序的目标索引。
Interbase 7.5 及更早老版本
这类老版本没有原生混合排序能力,可以通过计算字段曲线实现:
- 给
ARTIKMUT表新增一个计算字段,命名为DATUM_DESC,逻辑为用对应字段类型的存储上限值减去DATUM原值——日期类型本质是数值型存储,计算后的字段升序排序效果和原DATUM字段降序完全一致 - 基于计算字段和其余升序字段创建普通升序索引即可,参考语句:
-- 日期类型场景下新增计算字段 ALTER TABLE ARTIKMUT ADD DATUM_DESC COMPUTED BY (CAST('9999-12-31' AS DATE) - DATUM); -- 创建统一升序索引,DATUM_DESC升序等价于原DATUM降序 CREATE INDEX AMUT_DAT ON ARTIKMUT(DATUM_DESC, ARTIKEL, KODE);
后续查询写ORDER BY DATUM DESC, ARTIKEL ASC, KODE ASC时,Interbase优化器会自动匹配到该索引,不需要手动引用新增的计算字段。
内容的提问来源于stack exchange,提问作者Hans van der Rijst
相关产品推荐
相关产品推荐

