如何在sqlite数据库中检查值是否为(null)

时间:2015-07-24 11:09:50

标签: database sqlite

我想知道如果在sqlite数据库中任何值不为null,我该如何匹配。我正在尝试column_name IS NOT NULL,但它没有给我正确的结果。实际上它在某个地方NULL,而在某个地方它是表中的(null)。我认为它会检查NULL而不是(null)。如何获得不是(null)的结果?

请查看图片

See the picture

表格定义

enter image description here

或者两个空值之间有什么区别?

2 个答案:

答案 0 :(得分:2)

您使用IS NOT NULL个关键字匹配非空列。

您看到的(null)就是编辑器如何表明该列没有价值。

以SQLite(WebSQL)SQLFiddle为例:http://sqlfiddle.com/#!7/178db/3

create table test (
  field1 int,
  field2 int
);

insert into test (field1) values (1);
insert into test (field1) values (2);

-- below statement will result in no results
select * from test where field2 is not null;

-- below statement will result in 2 records
select * from test where field2 is null;

field1  field2
------  ------
     1  (null)
     2  (null)

在Mac上测试

在Mac中打开终端并输入以下命令。

$> sqlite testfile.sqlite.db
sqlite> select * from testing;
sqlite> insert into testing (field1) values (1);
sqlite> insert into testing (field1) values (2);

-- Notice the results
sqlite> select * from testing;
1|
2|

-- Notice the results when requesting field2 is null
sqlite> select * from testing where field2 is null;
1|
2|

-- Notice the results when requesting field2 is NOT null
sqlite> select * from testing where field2 is not null;
sqlite> .quit

现在,转到SQLite文件所在的目录

$> cd /Users/<you>/Documents
$> sqlite <myfile.db>

-- retrieve your table's CREATE TABLE statement 
-- and add it to your answer
$> .dump ServiceObjects

-- check to see if your NULL values are appearing similar to the example above
-- if feasible, paste a portion of your output in your answer as well
$> select * from ServiceObjects

-- try running queries with WHERE <field-of-interest> IS NOT NULL
-- try running queries with WHERE <field-of-interest> IS NULL

你得到的结果与我看到的结果相似吗?还请在您编辑的答案中包含您的SQLite版本。我使用的是3.8.10.2。

答案 1 :(得分:2)

来自sqlite datatype

  

任何列仍然可以存储任何类型的数据。这只是一些   在给定选择的情况下,列将优先使用一个存储类   另一个。列的首选存储类称为其   &#34;亲和力&#34 ;.

     

具有TEXT亲缘关系的列使用存储类存储所有数据   NULL,TEXT或BLOB。如果将数值数据插入到列中   TEXT亲缘关系在存储之前将其转换为文本形式。

     

具有NUMERIC亲和力的列可能包含使用全部五个值的值   存储类。当文本数据插入NUMERIC列时,   文本的存储类转换为INTEGER或REAL(按顺序)   如果这种转换是无损且可逆的,则优先考虑。

所以在这一行的某处,这些列用文字值&#39;(null)&#39; 写成。并且这个值可以是例如没有转换为INTEGER而没有损失。

我建议您使用

更新您的表格
UPDATE yourtable SET name IS NULL WHERE name = '(null)';
UPDATE yourtable SET desc IS NULL WHERE desc = '(null)';
UPDATE ... a.s.o

用于所有相关的表和列,以便获得一致的表。