gpt4 book ai didi

sql - 检查不平等的有效方法

转载 作者:行者123 更新时间:2023-12-03 01:35:19 25 4
gpt4 key购买 nike

我正在编写一个正在执行的触发器

IF (@A <> @B)
...

但这对于 @A 或 @B 上的 NULL 值不起作用。通常完成的方式是

IF (@A <> @B) OR (@A IS NOT NULL AND @B IS NULL) OR (@A IS NULL AND @B IS NOT NULL)

但这涉及最多 9 次与 1 次比较!

我可以做到

SET ANSI_NULLS OFF

但显然不建议这样做(并且将被弃用)。

那么最好的解决方案是什么?当它应该是 1 时,只进行 9 次比较来进行简单的不等式检查?触发器对性能并不重要,但它确实需要足够快。批量加载时,这可能会大大减慢速度。

性能测试

以下是 performance test 的结果检查不等性一百万次,这样 90% 的时间值不相等,10% 的时间每个值可能为空。

IF (@A <> @B) OR (@A IS NULL AND @B IS NOT NULL) OR (@A IS NOT NULL AND @B IS NULL)

结果:平均 3848ms

IF (ISNULL(@A, 0) <> ISNULL(@B, 0)) 

结果:平均 3942ms

IF (@A = @B) GOTO Equal ELSE IF @A IS NULL AND @B IS NULL GOTO Equal

结果:平均 4140ms

IF EXISTS (SELECT @A EXCEPT SELECT @B)

结果:平均 7795ms

时间并不重要,重要的是相对差异。显然,经典方法是最快的。 MSSQL 可能已针对此类检查进行了内部优化。

在 MacBook Pro 上测试运行(运行 MSSQL 2008 Express 的 Vista 虚拟机内配备 Intel Core 2 Duo、2.4Ghz、8GB RAM)。

最佳答案

ANSI SQL 具有IS DISTINCT FROM,但这在 SQL Server 中并未实现。可以是simulated以一种不依赖魔术常量的方式,并且如果在列上使用,则可以进行控制

IF EXISTS (SELECT @A EXCEPT SELECT @B)
PRINT 'Different'

关于sql - 检查不平等的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15471741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com