首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何比较T-SQL中可能都为null的值

如何比较T-SQL中可能都为null的值
EN

Stack Overflow用户
提问于 2009-07-02 15:42:18
回答 11查看 111.3K关注 0票数 84

我想确保我没有在我的表中插入重复的行(例如,只有主键不同)。我所有的字段都允许null,因为我已经决定null表示“所有值”。由于存在空值,我的存储过程中的以下语句无法工作:

代码语言:javascript
复制
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语句,我如何检查重复项?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-07-02 15:55:31

使用INTERSECT运算符。

如果您对所有字段都有一个复合索引,那么它就是NULL、-sensitive和efficient:

代码语言:javascript
复制
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索引,您的工作将会简单得多。

票数 55
EN

Stack Overflow用户

发布于 2013-06-21 18:55:58

使用与@Eric's answer相同的线条,但不使用'NULL'符号。

代码语言:javascript
复制
(Field1 = Field2) OR (ISNULL(Field1, Field2) IS NULL)

只有当两个值都为non-NULL且相等,或者两个值都为NULL时,才会出现这种情况

票数 88
EN

Stack Overflow用户

发布于 2009-07-02 15:44:18

使用ISNULL

代码语言:javascript
复制
ISNULL(MY_FIELD1, 'NULL') = ISNULL(@IN_MY_FIELD1, 'NULL')

如果这样做更有意义,您可以将'NULL'更改为类似于'All Values'的内容。

应该注意的是,使用两个参数时,ISNULL的工作方式与COALESCE相同,如果您有几个值要测试(即-COALESCE(@IN_MY_FIELD1, @OtherVal, 'NULL')),则可以使用它。在第一个非空值之后,COALESCE也会返回,这意味着如果您希望MY_FIELD1为空,那么它(稍微)更快。但是,我发现ISNULL的可读性更好,所以我在这里使用它。

票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1075142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档