在Oracle中使用类似数值的字符串值

时间:2018-05-07 07:22:27

标签: sql oracle query-performance

我的oracle查询中有一个条件:

AND a.ACCARDACNT > '0880080200000006' and a.ACCARDACNT < '0880080200001000'
表中的

类型的ACCARDACNT列是varchar并已编入索引,但在这种情况下我想将其用作数字。当我执行此查询时,执行计划显示CBO可以使用索引并按索引扫描表。 这是真的吗?

我想使用并将它们作为数字进行比较,并使用索引。有没有解决方案?

6 个答案:

答案 0 :(得分:3)

如果保证所有ComboBox.SelectedItem都是数字,那么只需使用

即可
<local:SalesPeriodVM />

这确保数字不会被比较为ACCARDACNT的字符串,因为查看第一个字符'2'大于'1'。

(如果是十进制数字,请确保字符串中存储的小数分隔符与当前会话设置匹配。)

如果要为此提供索引,请使用此函数索引:

and to_number(a.accardacnt) > 880080200000006 and a.accardacnt < 880080200001000;

或包含'2' > '10'的复合索引。由于字符串查询的执行计划显示了要使用的索引,因此对于数字比较和函数索引应该如此。 (请记住,DBMS可以自由使用提供的索引。我们只是提供它们,但DBMS最好知道在查询中使用它们是否合理。)

答案 1 :(得分:1)

认为你不能一起使用数字比较和索引。

  

执行计划显示CBO可以使用索引

此处可能会使用完整索引扫描,因此它只是一个表扫描,但列数较少。

可能的方法是将数字转换为带有前导零的固定长度字符串,然后使用相应的字符串。在这种情况下,将使用索引。

答案 2 :(得分:0)

您当前的查询应该能够使用索引。但问题是你正在对文本进行合作,但希望它能够按数字排序。通常,它可能不是因为文本在SQL中按字典顺序排序(即按字典顺序排序)。因此,要获得正确的排序行为,您必须将android:theme="@style/PurpleThemeOverlay"转换为数字:

ACCARDACNT

答案 3 :(得分:0)

另一个选项仍然是计算列:

alter table mytable add accardacnt_num as (to_number(accardacnt));

并提供一个或多个包含此列的索引:

create index idx_accardacnt_num on mytable(accardacnt_num);

然后现有代码继续工作,但新查询可以从数字列中受益:

and a.accardacnt_num > 880080200000006 and a.accardacnt_num < 880080200001000;

答案 4 :(得分:0)

我认为以下逻辑可以满足您的需求:

a.ACCARDACNT > '0880080200000006' and
a.ACCARDACNT < '0880080200001000' and
length(ACCARDACNT) = 16

此外,如果有适当的索引,可以在列上使用索引。

如果您希望15个字符的帐号'880080200000060'符合您的条件,那么这是不正确的。我的猜测是你不想要这个。

答案 5 :(得分:0)

您必须在列上创建一个函数索引:accardacnt

create index idx_fn_accardant on table_name( to_number(accardacnt) );

在查询查询的where子句中将其转换为数字:

where to_number(ACCARDACNT) > 0880080200000006 and to_number(ACCARDACNT) < 0880080200001000