【问题标题】:Reversing a string using an index in Oracle在 Oracle 中使用索引反转字符串
【发布时间】:2011-10-08 18:00:54
【问题描述】:

我有一个包含 ID 和字符串的表,我需要能够正确索引以搜索字符串的结尾。我们目前处理它的方式是将信息复制到另一个表中并反转每个字符串并正常索引它。我想做的是使用某种允许反向搜索的索引。

例子

Data: 
F7421kFSD1234 
d7421kFSD1235 
F7541kFSD1236 
d7421kFSD1234
F7421kFSD1235 
b8765kFSD1235 
d7421kFSD1234

我们的用户通常输入搜索的方式类似于...

*1234

通过反转字符串(以及搜索字符串:4321*),我可以在不完全扫描整个表的情况下找到我要查找的内容。我的问题是:制作第二张桌子是最好的方法吗?

有没有办法反转索引? 我试过这样的索引...

create index REVERSE_STR_IDX on TABLE(STRING) REVERSE;

但是 oracle 似乎没有按照解释计划使用它。

提前感谢您的帮助。


更新:

我确实遇到了未正确反转 unicode 字符的问题。解决这个问题的方法是铸造它们。

例子:

select REVERSE(cast(string AS varchar2(2000)))
from tbl 
where id = 1

【问题讨论】:

    标签: oracle indexing oracle10g reverse


    【解决方案1】:

    有一种说法是反向键索引可以用于此目的,但是,我从未见过这种做法。

    我会尝试基于“手动”函数的索引。

    CREATE INDEX REVERSE_STR_IDX on TBL(reverse(string));
    
    SELECT *
      FROM TBL
     WHERE reverse(string) LIKE '4321%';
    

    【讨论】:

    • 同意。反向键索引是为特定用例设计的 - 消除围绕顺序索引值(右腿索引)的块争用。优化器拒绝考虑对反向键索引使用范围扫描。
    • 顺便说一句,REVERSE 是基于字节的。如果您使用多字节字符,您可能无法获得预期的结果。
    • 要解决多字节字符的问题,您应该将反向函数应用于比较的两侧,即LIKE reverse('%1234') - 尽管我不确定字节反转字符串中的 % 有多好将起作用 - 即,如果在字符串反转时紧跟 % 的字节恰好开始一个多字节字符,则 LIKE 可能无法按预期工作。
    猜你喜欢
    • 1970-01-01
    • 2022-11-05
    • 2014-03-30
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多