如何在 Informix 中的 DATETIME 列上添加索引

问题描述 投票:0回答:1

我有这样的疑问

SELECT 
patient_id, patient_name 
FROM 
patient_details_tbl 
WHERE 
date(generated_time) between '2024-01-01' and '2024-04-30';

我知道如果我只是在

generated_time
列上创建索引,那么如果我们使用
date(generated_time)
进行查询,它将无法工作。

在Oracle中,我们有一个函数索引,它为这种列创建了一种间接的方式。

但是如何在 Informix 中创建功能索引来实现这一点呢?

当我尝试这个语句时,它失败并出现错误

-674: Routine (date) can not be resolved.

CREATE INDEX idx_pdt_gen_time ON patient_details_tbl(date(generated_time)) ONLINE;

请给我在 Informix 中实现此目的的代码。

简化的表架构:

CREATE TABLE patient_details_tbl
(
    patient_id varchar(15),
    patient_name varchar(70),
    gender_id smallint,
    mobile_no integer,
    state_id integer,
    country_id integer,
    generated_date datetime year to fraction
);
indexing informix
1个回答
0
投票

Informix 有功能索引。 CREATE INDEX 的文档非常丰富。 索引键规范部分表明您可以使用:

函数 ( func_col [, func_col]... )

也就是说,你可以调用一个函数。因此,您提出的语句正是要使用的语法。

所以,对我来说,问题变成了,“为什么你对该怎么做感到困惑?”

当我尝试创建索引时,我发现:

SQL -674: Routine (date) can not be resolved.

如果该信息包含在问题中,那就会有帮助了!如果您收到错误消息,报告错误是什么会有所帮助。

我认为,这是 Informix 中的一个错误(其错误编号为 CQ idsdb00114718)。我认为它源自 Informix Universal Server 9.00(大约 1997 年)之前存在的 DATE 函数。现在有不同的方法来识别函数,并且 DATE 的处理方式不像新函数那样。我尝试使用

EXTEND(generated_time, YEAR TO DAY)
作为函数;它不喜欢那样。尝试
TO_DATE(generated_time)
也没有成功(
-9700: Routine (to_date) ambiguous - more than one routine resolves to given signature
)。

我尝试创建一个函数:

CREATE FUNCTION date_from_datetime(dt DATETIME YEAR TO DAY)
    RETURNING DATE WITH(NOT VARIANT);
    RETURN dt;
END FUNCTION;

如果没有

WITH (NOT VARIANT)
,它会生成一个新错误:
-9848: Functional key part cannot use a variant function (date_from_datetime)
。索引语句的
ONLINE
选项被拒绝,并出现错误
-21522: No online index build possible
,但是当省略该选项时,索引已成功创建。

这是circumlocuitous(正如“circumlocuitous”这个词)。

© www.soinside.com 2019 - 2024. All rights reserved.