1

我试图理解为什么 NVL 在直接 SELECT 中可以正常工作,但在 INDEX 中却不行。下面展示了它在创建 INDEX 之前是如何完美工作的(列 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 时,我没有得到预期的“空”字符串:

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

我很可能误解了什么。您能看出 INDEX 似乎有什么问题吗?

4

2 回答 2

1

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

鉴于您的解释,您实际上是在寻找虚拟列

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
于 2014-11-27T18:27:53.680 回答
0

'NULL' 不等于 NULL。当您将某些内容放在引号内时,它就是一个字符串。

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

于 2014-11-27T18:25:57.693 回答