按数字列开头,使用给定的数字

时间:2017-10-03 11:38:29

标签: sql oracle

我想基于数字列过滤我的行。问题是输入是一种模式 - 例如 - 从2045年开始的数字。我能做到这一点:

select *
from my_table
where num_column like '2045%';

它有效,但不允许我在列上使用索引。 num_column上的隐式to_char会降低性能。

是否有更合适的方法可以查询相同的方法并仍然使用索引?

这假定数字始终 start 具有给定输入(不在中间或结尾),并且列中的值具有可变位数。

2 个答案:

答案 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 ) );