我有一个条件所在的唯一索引。但它不起作用。也许我缺少了一些东西。
CREATE UNIQUE NONCLUSTERED INDEX [IDX_NBR_TIN_INFO_PASSPORT]
ON [dbo].[NBR_TIN_INFO] ([PASSPORT_NUMBER] ASC)
WHERE (([PASSPORT_NUMBER] IS NOT NULL) AND ([IS_TOKEN_APPROVED] <> 0))
GO
插入表中的数据如下所示:
PASSPORT_NUMBER | IS_TOKEN_APPROVED
----------------+-------------------
XXX-487545 | NULL
XXX-487545 | 0
XXX-487545 | NULL
但是第1行或第3行应被索引阻止。
答案 0 :(得分:0)
发生这种情况是因为在每个比较中NULL都是未知的,即0 = NULL也不是0 <> NULL。因此,您不会为这些行建立索引。试试这个:
WHERE (([PASSPORT_NUMBER] IS NOT NULL)
AND ([IS_TOKEN_APPROVED]<>0 OR [IS_TOKEN_APPROVED] IS NULL))
答案 1 :(得分:0)
您需要通过将两个列都添加到索引中并删除过滤器来解决此问题
CREATE UNIQUE NONCLUSTERED INDEX [IDX_NBR_TIN_INFO_PASSPORT]
ON [dbo].[NBR_TIN_INFO] ([PASSPORT_NUMBER] ASC),
[dbo].[NBR_TIN_INFO] ([IS_TOKEN_APPROVED])
GO