一尘不染

如何比较在T-SQL中可能都为空的值

sql

我想确保我没有在表中插入重复的行(例如,仅主键不同)。我所有的字段都允许使用NULLS,因为我将null表示为“所有值”。由于为空,因此我的存储过程中的以下语句不起作用:

IF EXISTS(SELECT * FROM MY_TABLE WHERE 
    MY_FIELD1 = @IN_MY_FIELD1  AND
    MY_FIELD2 = @IN_MY_FIELD2  AND
    MY_FIELD3 = @IN_MY_FIELD3  AND 
    MY_FIELD4 = @IN_MY_FIELD4  AND
    MY_FIELD5 = @IN_MY_FIELD5  AND
    MY_FIELD6 = @IN_MY_FIELD6)
    BEGIN
        goto on_duplicate
    END

因为NULL = NULL不为真。

如何在没有每一列都具有IF IS NULL语句的情况下检查重复项?


阅读 159

收藏
2021-03-17

共1个答案

一尘不染

使用INTERSECT运算符。

NULL如果您在所有字段上都有一个复合索引,则它是敏感且高效的:

IF      EXISTS
        (
        SELECT  MY_FIELD1, MY_FIELD2, MY_FIELD3, MY_FIELD4, MY_FIELD5, MY_FIELD6
        FROM    MY_TABLE
        INTERSECT
        SELECT  @IN_MY_FIELD1, @IN_MY_FIELD2, @IN_MY_FIELD3, @IN_MY_FIELD4, @IN_MY_FIELD5, @IN_MY_FIELD6
        )
BEGIN
        goto on_duplicate
END

请注意,如果您UNIQUE在字段上创建索引,您的生活将变得更加简单。

2021-03-17