3

我正在使用活动记录运行 CodeIgniter。下面是我的表结构:

id (int)   user (int)   is_complete (tinyint)
------------------------------------------------
1          24           1
2          24           1
3          24           NULL
4          24           0
5          24           0

情况1

$this->db->where('user', 24);

询问:

SELECT * FROM `table` WHERE `user` = 24

工作和回报:

id   user   is_complete
--------------------------
1    24     1
2    24     1
3    24     NULL
4    24     0
5    24     0

案例2

$this->db->where('user', 24);
$this->db->where('is_complete', 1);

询问:

SELECT * FROM `table` WHERE `user` = 24 AND `is_complete` = 1

工作和回报:

id   user   is_complete
--------------------------
1    24     1
2    24     1

案例3

$this->db->where('user', 24);
$this->db->where('is_complete !=', 1);

询问:

SELECT * FROM `table` WHERE `user` = 24 AND `is_complete` != 1

不起作用并正在返回:

id   user   is_complete
--------------------------
4    24     0
5    24     0 

案例4

$this->db->where('user', 24);
$this->db->where('is_complete <>', 1);

询问:

SELECT * FROM `table` WHERE `user` = 24 AND `is_complete` <> 1

不起作用并正在返回:

id   user   is_complete
--------------------------
4    24     0
5    24     0 

需要结果

应该返回:

id   user   is_complete
--------------------------
3    24     NULL
4    24     0
5    24     0

我使用该方法做错了什么where(),还是有更好的方法来完成这个?

4

3 回答 3

6

这是数据库级别的问题,尽管它不是错误 - 这就是 SQL 处理空值的方式。这个查询:

SELECT
    *
FROM
    `table`
WHERE
    `user` = 24 AND `is_complete` != 1

将返回is_complete不等于 1 但不为空的记录。如果您还希望包含空记录,则需要执行以下操作:

SELECT
    *
FROM
    `table`
WHERE
    `user` = 24 AND
    (`is_complete` != 1 OR `is_complete` IS NULL)

通过将列与非空值进行比较,您自动排除了需要使用不同语法处理的空值。

您需要为查询添加一个额外的括号子句;请参阅此处了解如何

于 2013-09-12T19:27:28.480 回答
1

案例 3 正在运行NULL在 SQL 中与数字不同,需要不同的比较器。我认为 NULL 是没有任何东西,而 0 是数字 0;这是一个微妙的区别。所以!= 1给出除 1 之外的所有数字,而要找到 null,您必须使用is/is not null比较器。

查找所需结果的查询是:

$this->db->where("((is_complete = 0) OR (is_complete is null))",NULL,FALSE);

搜索!= 1与搜索不同= 0。(如果可能is_complete有一个值,比如'3'。如果你搜索你想要的东西,而不是不应该存在的东西,你可能会在代码中遇到更少的问题)。

where如果使用第三个 (FALSE) 参数来删除反引号,则该语句需要第二个参数。

于 2013-09-22T03:20:03.850 回答
0

使用活动记录来支持多数据库总是更好。

您可以使用这样的活动记录进行查询

案例3

$this->db->where('user', 24, FALSE);
$this->db->where('is_complete !=', 1, FALSE);

案例4

$this->db->where('user', 24, FALSE);
$this->db->where('is_complete <>', 1, FALSE);

第三个参数用于删除导致 sql 查询问题的反引号。

于 2017-06-29T13:59:38.703 回答