无法使用<>在Oracle中基于函数的索引

时间:2015-03-20 07:56:34

标签: oracle plsql oracle11g

我们正在尝试创建一个基于函数的索引,该索引具有<>在where子句中(但不等于),但得到一个错误,说

ORA-00907: missing right parenthesis

使用<>时是否有任何问题?条款?能不能在某种程度上发挥作用。

 CREATE INDEX IX_TEST_TABLE ON TEST_TABLE ((NVL(COL_A, 0) <> NVL(COL_B, 0));

2 个答案:

答案 0 :(得分:3)

您可以在case语句中使用该比较的结果来获得具有受支持的数据类型的实际值,而不是布尔值 - 已经注意到它已经不被支持y Oracle作为SQL数据类型。只要你保持一致,这个价值并不重要;你可以使用Y / N,0/1等

根据您的数据传播和查询方式的选择性,您可以使用位图索引:

create bitmap index ix_test_table on test_table
  (case when nvl(col_a, 0) <> nvl(col_b, 0) then 1 else 0 end);

然后查询相同的案例,当然:

select * from test_table
where case when nvl(col_a, 0) <> nvl(col_b, 0) then 1 else 0 end = 1;
select * from test_table
where case when nvl(col_a, 0) <> nvl(col_b, 0) then 1 else 0 end = 0;

或者,如果它非常有选择性,只使用您感兴趣的行的小子集,利用索引中不包含空值的事实:

create index ix_test_table on test_table
  (case when nvl(col_a, 0) <> nvl(col_b, 0) then 1 end);

select * from test_table
where case when nvl(col_a, 0) <> nvl(col_b, 0) then 1 end = 1;

您需要评估哪种数据适合您的数据。

答案 1 :(得分:0)

在Oracle中,BOOLEAN是一种仅限PL / SQL的类型,因此您无法在SQL中使用它,也不能在索引中使用它。索引中的函数导致true或false,因此不允许。