我有这样的疑问
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
);
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”这个词)。