sql-server - SQL中的NULL和编程语言中的NULL的区别

标签 sql-server tsql null

我刚刚遇到一个关于如何在 T-SQL(可能还有其他形式的 SQL)中处理 NULL 的有趣场景。 this question 很好地描述和回答了这个问题我在下面说明了这个问题;

-- SET ANSI_NULLS ON -- Toggle this between ON/OFF to see how it changes behaviour
DECLARE @VAR1 DATETIME 
DECLARE @VAR2 DATETIME 

SET @VAR1 = (SELECT CURRENT_TIMESTAMP)
SET @VAR2 = (SELECT NULL)

-- This will return 1 when ansi_nulls is off and nothing when ansi_nulls is on
SELECT 1 WHERE @VAR1 != @VAR2

DECLARE @TstTable TABLE (
   COL1 DATETIME,
   COL2 DATETIME)

INSERT INTO @TstTable
SELECT @VAR1, @VAR1
UNION 
SELECT @VAR1, NULL

-- This won't ever return a value irrespective of the ansi_nulls setting
SELECT * FROM @TstTable WHERE COL1 != COL2

这种情况让我质疑我对 SQL 中空表示的理解。我一直理解 null 意味着它没有值(value)。鉴于 this page 的第一段,这似乎是一个不正确的假设。 .它指出(我的重点......不过我可以很容易地突出整个段落);

A value of NULL indicates the value is unknown. A value of NULL is different from an empty or zero value. No two null values are equal. Comparisons between two null values, or between a NULL and any other value, return unknown because the value of each NULL is unknown.

这是否也适用于 T-SQL 变量条件?它肯定适用于我上面的 SELECT 1 WHERE @VAR1 != @VAR2 示例,但我不明白为什么 NULL 在这种情况下被认为是“未知”而不是空/未初始化/无等。我知道 ANSI_NULLS 改变了它的工作方式,但它已被弃用,将从 future 的某个版本中删除。

有人可以很好地解释为什么 T-SQL 中的 NULL 指的是未知 值而不是未初始化 值吗?如果是这样,您能否扩展您的答案以说明为什么具有 NULL 值的 T-SQL 变量也被认为是未知的?

最佳答案

在 SQL 中,我们感兴趣的是将事实存储在表中(也称为关系)。

什么 Codd asked for是:

Rule 3: Systematic treatment of null values:

The DBMS must allow each field to remain null (or empty). Specifically, it must support a representation of "missing information and inapplicable information" that is systematic, distinct from all regular values (for example, "distinct from zero or any other number", in the case of numeric values), and independent of data type. It is also implied that such representations must be manipulated by the DBMS in a systematic way.

我们最终得到的是三值逻辑(如@zmbq 所述)。为什么会这样?

我们要比较两个项目是否相等。他们平等吗?好吧,事实证明我们(还)不知道项目 1 是什么,我们(还)不知道项目 2 是什么(两者都是 NULL)。他们可能是平等的。他们可能不平等。用 TRUEFALSE 来回答相等性比较同样是错误的。所以我们回答 UNKNOWN


在其他语言中,null 通常与指针(或没有指针的语言中的引用,但特别是 C++ 中的引用)一起使用,以指示此时指针不指向任何东西。

关于sql-server - SQL中的NULL和编程语言中的NULL的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9529691/

相关文章:

sql - 如果传递 null 将引发错误的 TSQL 函数?

mysql - T SQL CASE WHEN EXISTS 更新语句

Oracle Date Formatting Null 日期为 00/00/0000

sql-server - 获取 SQL Server 中所有具有数据类型 uniqueidentifier 的主键的表

sql-server - 如何合并两个 Excel 工作表

sql - SQL 中的 ORDER BY,其中列是带有嵌入整数的合成字符串

tsql - 如何有条件地在 Sybase (SQL) 中创建表?

tsql - 忽略 INSERT SELECT 语句中的中间列的方法?

sql - 空字符串与NULL

typescript - 如何使用括号表示法检查 typescript 中的无效性