无法在 Oracle 中基于函数的索引中使用 <>
Not able to use <> in Function based Indexes in Oracle
我们正在尝试创建一个基于函数的索引,该索引在 where 子句中包含 <>(不等于),但出现
错误
ORA-00907: missing right parenthesis
使用 <> 子句有什么问题吗?能否以某种方式使其发挥作用。
CREATE INDEX IX_TEST_TABLE ON TEST_TABLE ((NVL(COL_A, 0) <> NVL(COL_B, 0));
在 Oracle 中,BOOLEAN 是 PL/SQL-only 类型,因此您不能在 SQL 中使用它,也不能在索引中使用它。您索引中的函数导致 true 或 false,因此不允许。
您可以在 case 语句中使用该比较的结果来得出一个实际值,该值具有受支持的数据类型,而不是布尔值 - 已经注意到 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;
您需要评估哪种方式适合您的数据。
我们正在尝试创建一个基于函数的索引,该索引在 where 子句中包含 <>(不等于),但出现
错误ORA-00907: missing right parenthesis
使用 <> 子句有什么问题吗?能否以某种方式使其发挥作用。
CREATE INDEX IX_TEST_TABLE ON TEST_TABLE ((NVL(COL_A, 0) <> NVL(COL_B, 0));
在 Oracle 中,BOOLEAN 是 PL/SQL-only 类型,因此您不能在 SQL 中使用它,也不能在索引中使用它。您索引中的函数导致 true 或 false,因此不允许。
您可以在 case 语句中使用该比较的结果来得出一个实际值,该值具有受支持的数据类型,而不是布尔值 - 已经注意到 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;
您需要评估哪种方式适合您的数据。