我想基于数字列过滤我的行。问题是输入是一种模式 - 例如 - 从2045年开始的数字。我能做到这一点:
select *
from my_table
where num_column like '2045%';
它有效,但不允许我在列上使用索引。 num_column上的隐式to_char
会降低性能。
是否有更合适的方法可以查询相同的方法并仍然使用索引?
这假定数字始终 start 具有给定输入(不在中间或结尾),并且列中的值具有可变位数。
答案 0 :(得分:2)
如果数字在特定范围内,那么您可以执行以下操作:
where num_column >= 2045000 and num_column < 2046000
我猜不是这样的。 。 。虽然你可以扩展这个:
where (num_column >= 2045 and num_column < 2046) or
(num_column >= 20450 and num_column < 20460) or
(num_column >= 204500 and num_column < 204600) or
. . .
我不确定Oracle是否真的会使用复杂or
的索引。
还有另一种解决方案。在表达式上创建索引并使用表达式:
create index idx_mytable_numcolumn_str on my_table(to_char(num_column));
然后你可以这样做:
where to_char(num_column) like '2045%'
答案 1 :(得分:0)
是否有更合适的方法可以查询相同的方法并仍然使用索引?
在列上创建基于函数的索引。
CREATE INDEX my_table__num_column__to_char__idx ON my_table ( TO_CHAR( num_column ) );