整数字段中的NULL与0

时间:2014-08-05 09:48:35

标签: sql sqlite

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

根据我的理解,SQLite将整数零表示为“null”,当我在select语句下运行时,不会获取应包含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 个答案:

答案 0 :(得分:9)

这不是问题; 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

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

答案 1 :(得分: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.

标准SQL在涉及NULLS时使用三值逻辑。对于习惯于两个有价值逻辑的人来说,三个有价值的逻辑令人困惑。