如何使用CodeIgniter的ActiveRecord选择列值不为空的行?


73

我正在使用CodeIgniter的Active Record类来查询MySQL数据库。我需要选择表中没有将字段设置为NULL的行:

$this->db->where('archived !=', 'NULL');
$q = $this->db->get('projects');

那只会返回以下查询:

SELECT * FROM projects WHERE archived != 'NULL';

archived字段是一个DATE字段。

有没有更好的方法来解决这个问题?我知道我可以自己编写查询,但是我想在整个代码中坚持使用Active Record。

Answers:


147
where('archived IS NOT NULL', null, false)

14
请注意,将第三个参数设置为FALSE时,CodeIgniter不会尝试使用反引号保护您的字段或表名。
本·罗格曼斯

11
另外值得一提的是,您可以在传递数组参数时使用它where(array("foo" => "bar", "archived IS NOT NULL" => null))。相当不直观,但是有效。
Andrey

64

活动记录肯定有一些怪癖。将数组传递给$this->db->where()函数时,它将生成IS NULL。例如:

$this->db->where(array('archived' => NULL));

产生

WHERE `archived` IS NULL 

奇怪的是,否定词没有对应的词IS NOT NULL。但是,有一种方法可以产生正确的结果,但仍然可以避免使用以下语句:

$this->db->where('archived IS NOT NULL');

产生

WHERE `archived` IS NOT NULL

13
+1,因为where('archived IS NOT NULL')这仍然可以保护标识符,而接受的答案却不能。
Thomas Daugaard 2013年

7

Null不能设置为字符串...

$this->db->where('archived IS NOT', null);

当null不包含在引号中时,它将正常工作。


3
@GusDeCooL不确定这是否真的有效。使用此输出...“字段不为”,不包含NULL。公认的答案似乎是正确执行此操作的方法。ellislab.com/forums/viewthread/119444/#593454-提供了我所能提供的更多信息。
andyface 2012年

7
-1,因为它不起作用!我尝试了类似的变化:$ this-> db-> where('when_removed is',null); 给出了一个数据库错误,并显示了生成的查询,包括:...“ When_removed”是ORDER BY“ last_name” asc ...
高度不规则

7

CodeIgniter 3

只要:

$this->db->where('archived IS NOT NULL');

生成的查询是:

WHERE archived IS NOT NULL;

$ this-> db-> where('archived IS NOT NULL',nullfalse);复制代码 <<不需要

逆:

$this->db->where('archived');

生成的查询是:

WHERE archived IS NULL;



0

Codeigniter通过不带任何参数的调用来生成“ IS NULL”查询:

$this->db->where('column');

生成的查询是:

WHERE `column` IS NULL

OP寻求的IS NOT NULL不是IS NULL
AndFisher '16

这是对其他问题的正确答案。
mickmackusa


0

您可以(如果要测试NULL)

$this->db->where_exec('archived IS NULL) 

如果要测试NOT NULL

$this->db->where_exec('archived IS NOT NULL) 

您在哪里找到这种where_exec()方法?我在CI项目中的任何地方都看不到它,也无法在网上找到任何提及其名称的资源。请通过文档链接支持此答案。
mickmackusa

-2

检查任一列是否为空的一种方法是

$this->db->where('archived => TRUE);
$q = $this->db->get('projects');

在php中,如果列中有数据,则可以将其表示为True,否则为False要在where命令中使用多重比较并检查列数据是否不为null,请执行以下操作

这是一个完整的示例,我如何过滤where子句中的列(Codeignitor)。最后一个显示Not NULL Compression

$where = array('somebit' => '1', 'status' => 'Published', 'archived ' => TRUE );
$this->db->where($where);

我只是尝试了一下,然后输出它生成的SQL :SELECT * FROM (`test`) WHERE `somebit` = '1' AND `status` = 'Published' AND `sc_id` = 1。检查列是否等于1和检查列是否不为null完全不同。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.