在TSQL中,以下示例会产生不同的结果吗?

时间:2018-03-05 15:00:12

标签: tsql optimization isnull

我必须在TSQL中更改更新查询以包含以下代码:

(uh.FirstName != cu.FirstName or isnull(uh.FirstName,'|||') != isnull(cu.Firstname,'|||')

但是在我看来这似乎是多余的,最好只使用第二部分:

isnull(uh.FirstName,'|||') != isnull(cu.Firstname,'|||')

我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

看起来ISNULL(x,'|||')只是试图处理考虑等效的空值。您必须处理每个空案例并可能加倍null,具体取决于是否为“匹配”。这是我的建议,注释行是选项,取决于你想如何处理double null。

(
    uh.FirstName != cu.FirstName 
        OR uh.FirstName IS NULL AND cu.FirstName IS NOT NULL
        OR uh.FirstName IS NOT NULL AND cur.FirstName IS NULL
        --OR uh.FirstName IS NULL AND cur.FirstName IS NULL
)

。不确定合并是否比替换和比较更快,但我的猜测是它会。它也不允许比较'|||'的模糊性为NULL会导致该解决方案产生错误结果。

*在HABO评论后修正

答案 1 :(得分:0)

除非您希望任何列实际包含三个管道('|||')的文字字符串值,否则您可以安全地使用第二个代码段。

快速演示:

DECLARE @T AS TABLE
(
    c1 varchar(5),
    c2 varchar(5)
);

INSERT INTO @T VALUES
('a', 'a'), 
('a', 'b'), 
('a', null), 
(null, 'a'), 
(null, null), 
('b', 'a');


SELECT *, 'First' as example
FROM @T
WHERE c1 != c2 OR ISNULL(c1, '|||') != ISNULL(c2, '|||')

SELECT *, 'Second' as example
FROM @T
WHERE ISNULL(c1, '|||') != ISNULL(c2, '|||')

结果:

c1      c2      example
a       b       First
a       NULL    First
NULL    a       First
b       a       First

c1      c2      example
a       b       Second
a       NULL    Second
NULL    a       Second
b       a       Second