- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您能否评论下所示的哪种方法更可取?我希望这个问题不会因为“自以为是”而被屏蔽。我愿意相信有一个解释可以清楚地说明这一点。
上下文:我有一个代码可以将第 3 方表内容镜像到我自己的表(优化)。它完美地工作了一段时间,直到数据库的大小/修改达到某个阈值。
优化基于更多表的行版本值,并记住源表中的最大值。通过这种方式,我可以逐步更新我的本地表,这比不时从头开始重建要快得多。
当 row-version 值超过 4byte 值时,问题开始出现。经过一些努力,我发现 binary(8)
值的高 4 个字节被设置为 0。后来,发现嫌疑人有一个形式 COALESCE(MAX(row_version) , 1)
。
COALESCE 用于覆盖本地表是新的,现在包含数据的情况——用于比较源表的 MAX(row_version)
和一些有意义的东西。
显示错误的示例:为了模拟最后提到的情况,我想将 binary(8)
列的 NULL 值转换为 1。我是还添加了稍后添加的 ISNULL
用法。原始代码仅包含 COALESCE。
DECLARE @bin8null binary(8) = NULL
SELECT 'bin NULL' AS the_variable, @bin8null AS value
SELECT 'coalesce 1' AS op, COALESCE(@bin8null, 1) AS good_value
SELECT 'coalesce 1 + convert' AS op, CONVERT(binary(8), COALESCE(@bin8null, 1)) AS good_value
SELECT 'isnull 1' AS op, ISNULL(@bin8null, 1) AS good_value
SELECT 'isnull 0x1' AS op, ISNULL(@bin8null, 0x1) AS bad_value
(图像coalesce 0x1 + convert
中存在错误,稍后在代码中修复为coalesce 1 + convert
,但图像中未修复。)
当二进制值大于可存储在 4 个字节中的部分时,会出现应用程序错误。这里使用了 0xAAAAAAAA
。 (实际上,0x00000001
就是这样,很难看出是单个的1变成了0。)
DECLARE @bin8 binary(8) = 0xAAAAAAAA01BB3A35
SELECT 'bin' AS the_variable, @bin8 AS value
SELECT 'coalesce 1' AS op, COALESCE(@bin8, 1) AS bad_value
SELECT 'coalesce 1 + convert' AS op, CONVERT(binary(8), COALESCE(@bin8, 1)) AS bad_value
SELECT 'coalesce 0x1 + convert ' AS op, CONVERT(binary(8), COALESCE(@bin8, 0x1)) AS good_value
SELECT 'isnull 1' AS op, ISNULL(@bin8, 1) AS good_value
SELECT 'isnull 0x1' AS op, ISNULL(@bin8, 0x1) AS good_value
在 MS-SQL Server 2014 上的 Microsoft SQL Server Management Studio 中执行时,结果如下所示:
描述 -- 我的理解:COALESCE()
似乎是从最后处理的参数的类型派生出结果的类型。这样,非 NULL binary(8)
被转换为 int
,这导致高 4 字节丢失。 (见图中第2和第3个红色bad_value
,两种情况的区别仅在于十进制/十六进制的显示形式。)
另一方面,ISNULL()
似乎保留了第一个参数的类型,并将第二个值转换为该类型。应该仔细理解 binary(8)
更像是一系列字节。作为一个大整数的解释只是解释。因此,作为默认值的 0x1
不会扩展为 8 字节整数并产生错误值。
我的解决方案: 因此,我已使用 ISNULL(MAX(row_version), 1)
修复了该错误。对吗?
最佳答案
这不是错误。他们被记录为处理 data type precedence不同的。 COALESCE
根据检查所有 参数确定输出的数据类型,而 ISNULL 有一种更简单的方法,只检查第一个参数。 (两者仍然需要包含完全兼容的值,这意味着它们都可能转换为确定的输出类型。)
来自COALESCE
topic :
Returns the data type of expression with the highest data type precedence.
ISNULL
topic没有以相同的方式进行这种区分,而是隐式声明第一个表达式确定类型:
replacement_value must be of a type that is implicitly convertible to the type of check_expression.
我有一个类似的例子(并描述了 COALESCE
和 ISNULL
之间的其他几个区别)here .基本上:
DECLARE @int int, @datetime datetime;
SELECT COALESCE(@int, CURRENT_TIMESTAMP);
-- works because datetime has a higher precedence than the chosen output type, int
2020-08-20 09:39:41.763
GO
DECLARE @int int, @datetime datetime;
SELECT ISNULL(@int, CURRENT_TIMESTAMP);
-- fails because int, the first (and chosen) output type, has a lower precedence than datetime
Msg 257, Level 16, State 3
Implicit conversion from data type datetime to int is not allowed. Use the CONVERT function to run this query.
关于sql - 二进制转换的意外行为(COALESCE 与 ISNULL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63506004/
我不知道此行为是设计使然还是 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
我是一名优秀的程序员,十分优秀!