【问题标题】:How to create index in VARCHAR2 column?如何在 VARCHAR2 列中创建索引?
【发布时间】:2020-06-23 00:00:51
【问题描述】:

我有两个表 table1 和 table2。我们使用以下条件加入两个表

FROM table1 
LEFT OUTER JOIN table2
ON table2.ID = tabe1.ID
AND TO_DATE(TO_CHAR(TO_TIMESTAMP(TRIM(REPLACE(EXE_TS,'IST','')),
                    'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD'),'YYYY-MM-DD')) 
    BETWEEN V_LAST_YEAR_DATE AND V_THIS_YEAR_DATE

ID 和 EXE_TS 列中的数据如下,两列都是 VARCHAR2 ID 示例 'S001' 和 EXE_TS '2018-12-13 09:23:13 IST'

我想使用 ORD_ID 和 EXE_TS 在 table2 列中创建一个索引。有人可以指导我如何实现这一目标。

【问题讨论】:

    标签: sql oracle indexing database-performance


    【解决方案1】:

    首先,不需要这个冗长的操作。

    你可以替换

    TO_DATE(TO_CHAR(TO_TIMESTAMP(TRIM(REPLACE(EXE_TS,'IST','')),
                   'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD'),
           'YYYY-MM-DD))
    

    TRUNC(TO_DATE(REPLACE(EXE_TS,'IST'),'YYYY-MM-DD HH24:MI:SS'))
    

    您可以在上面的表达式上创建索引,如下所示:

    Create index idx1
    On your_table (
    ord_id,
    TRUNC(TO_DATE(REPLACE(EXE_TS,'IST'),'YYYY-MM-DD HH24:MI:SS'))
    )
    

    干杯!!

    【讨论】:

    • 但是在创建索引时,我得到 ORA-0841(full) 年份必须在 -4713 和 +9999 之间,而不是 0 错误消息
    • 因为您的列是一个字符串,并且必须包含与'YYYY-MM-DD HH24:MI:SS' 不同的无效字符串。因此建议将日期作为数据类型赋予此类列。
    • 我不认为将时区硬编码为IST
    • 是的,也可以删除第一个空格后的所有内容
    猜你喜欢
    • 2019-07-27
    • 2011-04-13
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多