Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Oracle中创建唯一索引,但忽略空值?_Sql_Oracle_Ddl - Fatal编程技术网

Sql 如何在Oracle中创建唯一索引,但忽略空值?

Sql 如何在Oracle中创建唯一索引,但忽略空值?,sql,oracle,ddl,Sql,Oracle,Ddl,我试图在表中的两个字段上创建唯一约束。但是,一个值很可能为空。我只要求它们在两者都不为null时是唯一的(name永远不会为null) 忽略表名和字段名的语义以及这是否有意义——我只是编了一些 是否有一种方法可以在这些字段上创建一个唯一约束,该约束将强制两个非空值的唯一性,但如果有多个条目的name不为空且email为空,则忽略该约束 这个问题是针对SQL Server的,我希望答案不一样: 我们可以使用基于函数的索引来实现这一点。下面使用了NVL2(),如您所知,如果表达式不为null,则返回

我试图在表中的两个字段上创建唯一约束。但是,一个值很可能为空。我只要求它们在两者都不为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>