将NVL放入INDEX似乎不起作用(Oracle 11.2.0.4.0)

时间:2014-11-27 18:22:12

标签: oracle indexing null nvl

我试图理解为什么NVL在直接SELECT中工作正常,但在INDEX中却没有。这里展示了在创建INDEX之前它是如何工作的(columnn foo是varchar2):

SELECT id,foo FROM bar WHERE foo IS NULL;
1001
1002

SELECT id, NVL("FOO", 'null') FROM bar WHERE foo IS NULL;
1001    null
1002    null

现在我尝试创建一个INDEX,所以我不必将NVL放在SELECTS中:

CREATE INDEX "BUZ_UTV3"."IX_NULL_FOO" 
ON "BUZ_UTV3"."BAR" (NVL("FOO", 'null')) 
TABLESPACE "TEST01_BUZUTV3";

但是当我重新运行原来的SELECT时,我没有得到预期的' null'字符串:

SELECT id,foo FROM bar WHERE foo IS NULL;
1001
1002

我很可能误解了一些东西。你能看出INDEX的问题吗?

2 个答案:

答案 0 :(得分:1)

索引不会“添加”或“扩展”您的表,因为它们不会添加额外的“可查询”数据。它们只能帮助有效地检索数据。由于他们可以快速检查列中是否存在某些值,因此在强制值的唯一性时也会隐含它们。不多了。

根据您的解释,您实际上正在寻找virtual columns

alter table bar
      add foo2 varchar2(20)  -- <--- or whatever type you need
      generated always as (NVL(foo, 'null')) virtual;

select id, foo2 from bar where foo is null;

产:

ID      FOO2
1001    null
1002    null

答案 1 :(得分:0)

'NULL'不等于NULL。当你在引号内放一些东西时,它是一个字符串。

除此之外,为什么要检查变量是否为NULL然后使用NVL函数显示另一个NULL?没有意义。