整型字段中的NULL和0有什么区别?

10

如果一个SQLite3数据库包含一个整数字段的表,这些字段可能包含'null',但也可能包含整数0,那么我该如何区分这些值?

据我理解,SQLite将整数零表示为'null',当我运行下面的选择语句时,应该包含0的字段没有被取出。

SELECT integer_column 
FROM table_name 
WHERE integer_column IS NOT NULL; 

而且,当我运行以下查询时,没有行被返回。(即使已经插入了值为0的数据)。

SELECT integer_column
FROM table_name
WHERE integer_column = 0;

在SQLite中处理这个问题的最佳方式(常见做法)是什么?(请记住,我的表中的列既可以包含'null',也可以包含0,而且这两个值都不应被视为“损坏的数据”)。

2个回答

12
这不是问题;NULL0是不同的:
$ sqlite3
SQLite version 3.8.6 ...
sqlite> CREATE TABLE t(i, name);
sqlite> INSERT INTO t VALUES (0, 'zero');
sqlite> INSERT INTO t VALUES (NULL, 'null');
sqlite> SELECT * FROM t WHERE i = 0;
0|zero
sqlite> SELECT * FROM t WHERE i IS NULL;
|null

如果您的查询没有返回任何记录,原因是该表中没有包含这些值的行。

4
我非常确定SQLite不会将0表示为NULL。
如果您将A + 0,则会得到A(除非A为NULL)。 如果您将A + NULL,则会得到NULL。
If you test for equality to zero,  you should get the rows where zero has been stored. 
If you test for IS NULL, you should get the rows where NULL has been stored. 
If you test for equality to NULL, you should get nothing. 
If you test for inequality to NULL, you should get nothing.

当涉及到NULLS时,标准SQL使用三值逻辑。对于习惯于二值逻辑的人来说,三值逻辑是令人困惑的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接