- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在查看我继承的一些代码,我发现了这样一行:
And isnull(IH.CustomerItemNumber, '') <> ''
我的一位前辈似乎在大量的 where 子句或 join 子句中使用过。在我看来这是对函数的不必要调用,因此会消耗性能,因为 NULL 永远不会等于空字符串 '',对吧?
具体来说,我在特定查询中将其从连接子句中取出,性能显着提高(从 46-49 秒到 1-3 秒)。
将其替换为 AND IH.CustomerItemNumber <> ''
我的评估是否正确?这是多余且缓慢的,可以删除吗?这段代码在什么情况下可能有用?
编辑:那么,NULL 可以等于空字符串吗?
最佳答案
这在语义上与:
And IH.CustomerItemNumber <> '' And IH.CustomerItemNumber Is Not Null
所以它正在检查该列既不是空的,也不是空字符串。可能很重要。
更新
在这种情况下,因为我们正在寻找字符串文字(空字符串)的不相等性,所以您至少有三个语义正确的选项:
And IH.CustomerItemNumber <> ''
And IH.CustomerItemNumber <> '' And IH.CustomerItemNumber Is Not Null
And isnull(IH.CustomerItemNumber, '') <> ''
第一个将返回与其他两个相同的结果集,因为 <> ''
不会匹配空值,无论 ansi_nulls设置。
在开发系统的快速测试中,第一个和第二个都使用了索引查找。第一个是非常轻微在几个非常简化测试之一中优于第二个。
第三个,因为它增加了一个函数调用,可能不像其他的那样使用索引,所以这可能是最糟糕的选择。也就是说,在快速测试中,isnull 能够使用索引扫描。进一步添加Is Not Null
第三个选择实际上加快了速度并将其移至索引查找。去图(GO!GO!查询优化器!)。
与@Gordon 一样,我大多数时候也会选择第二个选项,因为它可以更好地向其他开发人员(或我自己)说明我的意图,并且如果我们要检查另一个列的相等性,这将是一个更好的做法,这可能是null(想想潜在的 ansi_nulls 关闭)。
为了完整起见:
And nullif(IH.CustomerItemNumber, '') is not null
And case when IH.CustomerItemNumber = '' then null else IH.CustomerItemNumber end is not null
And case IH.CustomerItemNumber when '' then null else IH.CustomerItemNumber end is not null
在 SQL Server 中都以完全相同的方式解释(据我所知),并且执行与上述第三个选项相同。
关于SQL 为什么使用 isnull(field, '' ) <> '' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13074730/
我不知道此行为是设计使然还是 EF6 中的错误,或者是否有其他方法可以执行此操作。具有这种复杂类型: [ComplexType] public partial class Company
我正在尝试使用 gulp 编译 React (.jsx)、coffeescript (.coffee) 和 vanilla javascript (.js) 文件,将所有生成的 .js 文件打包到一个
是否有像 ISNULL() 或 COALESCE() 这样的东西,但不是检查空值而是检查空值。 例如: SELECT cu.last_name, cu.first_name, cu.email,
我有一个存储过程: [checkCultureCode] @InputCulture varchar(5) = 'en-US', @ValidCulture varchar(5) OUTPUT AS
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
我有一个日期列,其中一些行有 NULL 值。我想使用 ISNULL 或类似的东西来用“N/A”之类的东西替换这些值,但是,当我尝试使用 ISNULL 时,由于两种不同的数据类型,我收到一个错误。如果我
因此,我目前正在使用 SSIS 2008 从旧的 Advantage 数据库服务器迁移到 SQL 2005。旧的 Advantage 数据库中的列之一是 MEMO 类型。默认情况下,这会转换为 DT_
我有下面的代码,它返回邮政编码的访问顺序。我能够正确返回邮政编码,但为了使数据更加用户友好,我在邮政编码之间添加了破折号(-)。 问题来自于这样一个事实:我无法弄清楚如何消除只有 2 或 3 个邮政编
我在存储过程中有以下逻辑。 这里完成了什么? 如果color为null,替换为'' IF ISNULL(@color, '') <> '' BEGIN END 最佳答案 它等同于: IF (@colo
如何检查一个字符串是否为 null,如果为 null 则将其设置为某个值? 就像在 SQL 中一样, isnull(string, 0) 最佳答案 你可以测试空值: if (s == null)
先来有用的 复制代码代码如下: use 数据库 update news set author='jb51' where author is null 如果你的不正
我有一个 User 实体,我尝试通过与 UserGroup 的多对多关系加入它。它工作正常,但我尝试过滤连接的实体,因为我使用了一个软删除字段。 class User { // ...
在没有记录匹配的情况下 ICAO='YXTO' SELECT 1, ISNULL((SELECT ID FROM Location WHERE ICAO='YXTO'),2) 返回 1,2 鉴于 SE
我正在尝试将名为“Number”的列字段的值增加 1,如果该值当前为 Null,我想将该值设置为 1,因为 Null 值无法增加。我发现了 isNull() 函数并且没有使用以下语句获得结果: Upd
我想确认数组已创建,怎么办?有没有nul关键字? Dim items As Array = str.Split("|") if (items=null) then ??? 最佳答案 要检查 VB.N
我有一个日期时间字段,它可以为空,id 喜欢做 qs.order_by('field__isnull', 'name') 但这会导致: Join on field 'field' not permit
我有一张大 table 用户 和一张小 table 用户_购买在谷歌大查询中。 如果我加入这两个 SELECT User.id, User_purchase.amount FROM User
[表] USER_INFO user_id | user_name a123 | facebook b123 | google c123 | NULL [询问] se
我有一个数据框 df。代码是这样写的 df.isnull().mean().sort_values(ascending = False) 这是输出的一部分- inq_fi
Cyan 45.0 HG8-Bla
我是一名优秀的程序员,十分优秀!