我想确保我没有在我的表中插入重复的行(例如,只有主键不同)。我所有的字段都允许null,因为我已经决定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语句,我如何检查重复项?
发布于 2009-07-02 15:55:31
使用INTERSECT
运算符。
如果您对所有字段都有一个复合索引,那么它就是NULL
、-sensitive和efficient:
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
索引,您的工作将会简单得多。
发布于 2013-06-21 18:55:58
使用与@Eric's answer相同的线条,但不使用'NULL'
符号。
(Field1 = Field2) OR (ISNULL(Field1, Field2) IS NULL)
只有当两个值都为non-NULL
且相等,或者两个值都为NULL
时,才会出现这种情况
发布于 2009-07-02 15:44:18
https://stackoverflow.com/questions/1075142
复制相似问题