我的oracle查询中有一个条件:
AND a.ACCARDACNT > '0880080200000006' and a.ACCARDACNT < '0880080200001000'
表中的类型的ACCARDACNT列是varchar
并已编入索引,但在这种情况下我想将其用作数字。当我执行此查询时,执行计划显示CBO可以使用索引并按索引扫描表。
这是真的吗?
我想使用并将它们作为数字进行比较,并使用索引。有没有解决方案?
答案 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