我试图理解为什么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的问题吗?
答案 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?没有意义。