我正在使用活动记录运行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()
方法做错了什么,或者有更好的方法来实现这一目标?
这是数据库级别的一个问题,尽管它不是一个错误 - 这就是SQL处理空值的方式。此查询:
SELECT
*
FROM
`table`
WHERE
`user` = 24 AND `is_complete` != 1
将返回 is_complete
不等于 1 但不为 null 的记录。如果您还希望包含空记录,则需要执行以下操作:
SELECT
*
FROM
`table`
WHERE
`user` = 24 AND
(`is_complete` != 1 OR `is_complete` IS NULL)
通过将列与非 null 值进行比较,您自动排除了 null,这些 null 需要使用不同的语法进行处理。
您需要为查询添加一个额外的括号子句;请参阅此处了解如何操作。
情况 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"。如果你搜索你想要的东西,而不是不应该存在的东西,你可能会在代码中遇到更少的问题。
如果使用第三个 (FALSE) 参数来删除反引号,则 where
语句需要第二个参数。
最好
使用活动记录来支持多数据库。
您可以将此类活动记录用于查询
案例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 查询问题的反引号。