首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL create index on cast from string to date

PostgreSQL create index on cast from string to date
EN

Stack Overflow用户
提问于 2013-05-07 03:16:01
回答 2查看 17.6K关注 0票数 18

我正在尝试为到目前为止的varchar列的转换创建一个索引。我正在做这样的事情:

代码语言:javascript
复制
CREATE INDEX date_index ON table_name (CAST(varchar_column AS DATE));

我得到了错误:functions in index expression must be marked IMMUTABLE,但我不明白为什么,到目前为止的转换并不依赖于时区或类似的东西(这使得转换到带有时区的时间戳会给出这个错误)。

有什么帮助吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-07 03:37:48

您的第一个错误是将日期存储为varchar列。你不应该那样做。

列问题的正确修复方法是将列转换为实际的 date

现在我很确定这句话的答案是“数据库不是我设计的,我不能改变它”,所以这里有一个变通办法:

CASTto_char()不是不可变的,因为它们可以根据当前会话的设置为相同的输入值返回不同的值。

如果您知道表中所有值的格式都是一致的(如果有的话,这意味着您可以将列转换为实际的date列),那么您可以创建自己的函数,将varchar转换为日期并标记为不可变。

代码语言:javascript
复制
create or replace function fix_bad_datatype(the_date varchar)
   returns date
   language sql
   immutable
as
$body$
  select to_date(the_date, 'yyyy-mm-dd');
$body$
ROWS 1
/

使用该定义,您可以在表达式上创建索引:

代码语言:javascript
复制
CREATE INDEX date_index ON table_name (fix_bad_datatype(varchar_column));

但您必须在查询中使用该函数调用,以便Postgres使用它:

代码语言:javascript
复制
select *
from foo
where fix_bad_datatype(varchar_column) < current_date;

请注意,如果varchar列中只有一个“非法”值,这种方法将失败得很严重。唯一明智的解决方案是将日期存储为dates的

票数 17
EN

Stack Overflow用户

发布于 2013-05-07 03:37:37

请提供数据库版本、表ddl和一些示例数据。

让你自己的不可变函数做你想做的事情,像这样吗?另外,在文档中创建一个新的演员,看看这是否对你有帮助。

代码语言:javascript
复制
create table emp2 (emp2_id integer, hire_date VARCHAR(100));

insert into emp2(hire_date)
select now();

select cast(hire_date as DATE)
from emp2


CREATE FUNCTION my_date_cast(VARCHAR) RETURNS DATE
    AS 'select cast($1 as DATE)'
    LANGUAGE SQL
    IMMUTABLE
    RETURNS NULL ON NULL INPUT;


CREATE INDEX idx_emp2_hire_date ON emp2 (my_date_cast(hire_date));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16405602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档