好的,我在寻找沮丧,所以我会问这里。 我正在研究的是MS sqlserver中的CONCAT_NULL_YIELDS_NULL设置。
我在sqlserver上编写的查询/存储过程中遇到了特殊的行为。
现在我几乎所有使用数据库的经验都在Oracle中,所以我终于找到了令我惊讶的是,MS故意丢弃了我的数据。
您看到我将值连接在一起形成一个用于记录/调试的字符串,每当发生任何有趣的事情时,我都没有得到任何空值。
所以我的问题实际上是双重的: a)如果一个片段为空,为什么人们想要丢弃所有数据? b)其他数据库引擎是否也有此缺陷,还是仅仅是MS?
我不是想在这里嗤之以鼻,老实说,我无法理解为什么这种情况是可以接受的。
答案 0 :(得分:2)
您将字符串连接在一起,而null不是字符串。 Null为空。它是它自己的类型,因此尝试将它连接到字符串应该需要显式转换为字符串类型,因为没有隐式转换。
设置CONCAT_NULL_YIELDS_NULL旨在根据SQL标准为尝试将null连接到字符串的行为提供一致且预期的响应。
如果此设置关闭,计算列和索引将在SQL Server中失败,并且MS在将来的版本中更改SQL Server以使其无法关闭设置。
答案 1 :(得分:0)
现实是NULL就像一个黑洞...... NULL加上任何东西都等于NULL。你也不能对NULL测试值,因为NULL不等于其他任何东西(甚至是另一个NULL)。这就是为什么有单独的语法" IS NULL"并且"不是空的"必须使用。
从本质上讲,数据库并没有丢弃你的数据,它正在做你正在告诉它做的事情。如上所述,评论"未知"加上任何已知的结果"未知"值...即NULL。
如果这对您有用,请务必使用COALESCE()或ISNULL()函数将空值转换为空字符串。问题解决了。