Sql 如何在Oracle中创建唯一索引,但忽略空值?
我试图在表中的两个字段上创建唯一约束。但是,一个值很可能为空。我只要求它们在两者都不为null时是唯一的(Sql 如何在Oracle中创建唯一索引,但忽略空值?,sql,oracle,ddl,Sql,Oracle,Ddl,我试图在表中的两个字段上创建唯一约束。但是,一个值很可能为空。我只要求它们在两者都不为null时是唯一的(name永远不会为null) 忽略表名和字段名的语义以及这是否有意义——我只是编了一些 是否有一种方法可以在这些字段上创建一个唯一约束,该约束将强制两个非空值的唯一性,但如果有多个条目的name不为空且email为空,则忽略该约束 这个问题是针对SQL Server的,我希望答案不一样: 我们可以使用基于函数的索引来实现这一点。下面使用了NVL2(),如您所知,如果表达式不为null,则返回
name
永远不会为null)
忽略表名和字段名的语义以及这是否有意义——我只是编了一些
是否有一种方法可以在这些字段上创建一个唯一约束,该约束将强制两个非空值的唯一性,但如果有多个条目的name
不为空且email
为空,则忽略该约束
这个问题是针对SQL Server的,我希望答案不一样:
我们可以使用基于函数的索引来实现这一点。下面使用了
NVL2()
,如您所知,如果表达式不为null,则返回一个值;如果表达式为null,则返回另一个值。您可以使用CASE()
SQL> create table blah (name varchar2(10), email varchar2(20))
2 /
Table created.
SQL> create unique index blah_uidx on blah
2 (nvl2(email, name, null), nvl2(name, email, null))
3 /
Index created.
SQL> insert into blah values ('APC', null)
2 /
1 row created.
SQL> insert into blah values ('APC', null)
2 /
1 row created.
SQL> insert into blah values (null, 'apc@example.com')
2 /
1 row created.
SQL> insert into blah values (null, 'apc@example.com')
2 /
1 row created.
SQL> insert into blah values ('APC', 'apc@example.com')
2 /
1 row created.
SQL> insert into blah values ('APC', 'apc@example.com')
2 /
insert into blah values ('APC', 'apc@example.com')
*
ERROR at line 1:
ORA-00001: unique constraint (APC.BLAH_UIDX) violated
SQL>
编辑
因为在您的场景中,将始终填充名称,所以您只需要这样一个索引:
SQL> create unique index blah_uidx on blah
2 (nvl2(email, name, null), email)
3 /
Index created.
SQL>
我不知道有多少人仍然被引导到这个答案,但至少在最新版本的oracle中,允许在唯一索引上有多个空行,并且不需要接受答案
SQL> create unique index blah_uidx on blah
2 (nvl2(email, name, null), email)
3 /
Index created.
SQL>