我们正在尝试创建一个基于函数的索引,该索引具有<>在where子句中(但不等于),但得到一个错误,说
ORA-00907: missing right parenthesis
使用<>时是否有任何问题?条款?能不能在某种程度上发挥作用。
CREATE INDEX IX_TEST_TABLE ON TEST_TABLE ((NVL(COL_A, 0) <> NVL(COL_B, 0));
答案 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,因此不允许。