使用CodeIgniter查询MySQL,选择field为NULL的行

reb*_*ion 72 mysql null activerecord codeigniter

我正在使用CodeIgniter的Active Record类来查询MySQL数据库.我需要在表中选择一个字段未设置为NULL的行:

$this->db->where('archived !=', 'NULL');
$q = $this->db->get('projects');
Run Code Online (Sandbox Code Playgroud)

这只返回此查询:

SELECT * FROM projects WHERE archived != 'NULL';
Run Code Online (Sandbox Code Playgroud)

archived字段是一个DATE字段.

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

zer*_*kms 138

where('archived IS NOT NULL', null, false)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,当您将此第三个参数设置为FALSE时,CodeIgniter将不会尝试使用反引号来保护您的字段或表名称. (13认同)
  • 还有一点值得补充的是,当你传递一个数组参数时可以使用它:`where(array("foo"=>"bar","archived IS NOT NULL"=> null))`.非常不直观但有效. (10认同)

J.M*_*ney 60

Active Record肯定有一些怪癖.将数组传递给$this->db->where()函数时,它将生成一个IS NULL.例如:

$this->db->where(array('archived' => NULL));
Run Code Online (Sandbox Code Playgroud)

产生

WHERE `archived` IS NULL 
Run Code Online (Sandbox Code Playgroud)

怪癖是负面的没有等价物IS NOT NULL.但是,有一种方法可以产生正确的结果并且仍然可以逃避声明:

$this->db->where('archived IS NOT NULL');
Run Code Online (Sandbox Code Playgroud)

产生

WHERE `archived` IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

  • +1因为`where('archived IS NOT NULL')`这仍然保护标识符,而接受的答案却没有. (13认同)

小智 7

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

$this->db->where('archived IS NOT', null);
Run Code Online (Sandbox Code Playgroud)

当null未包含在引号中时,它可以正常工作.

  • -1因为它不起作用!我尝试了类似的变体:$ this-> db-> where('when_removed is',null); 给出了一个数据库错误并显示生成的查询包括:... WHERE"when_removed"是ORDER BY"last_name"asc ... (7认同)
  • @GusDeCooL不确定这确实有效.使用此输出..."字段IS NOT"没有NULL.接受的答案似乎是正确地做到这一点的方法.http://ellislab.com/forums/viewthread/119444/#593454 - 提供了我能做的更多信息. (3认同)

Rod*_*zim 6

CodeIgniter 3

只要:

$this->db->where('archived IS NOT NULL');
Run Code Online (Sandbox Code Playgroud)

生成的查询是:

WHERE archived IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

$ this-> db-> where('archived IS NOT NULL',null,false); <<没必要

逆:

$this->db->where('archived');
Run Code Online (Sandbox Code Playgroud)

生成的查询是:

WHERE archived IS NULL;
Run Code Online (Sandbox Code Playgroud)


Raz*_*een 5

使用以下内容会更好:

对于不为空:

where('archived IS NOT NULL', null);
Run Code Online (Sandbox Code Playgroud)

对于空:

where('archived', null);
Run Code Online (Sandbox Code Playgroud)

更新

当检查 NULL 或 IS NOT NULL 时,我们可以在不需要 CodeIgniter 的 Active Record 的地方使用第二个参数。这是正确的用法:

对于 IS NOT NULL:

$this->db->where('archived IS NOT NULL');
$q = $this->db->get('projects');
Run Code Online (Sandbox Code Playgroud)

对于 IS NULL:

$this->db->where('archived IS NULL');
$q = $this->db->get('projects');
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您都不需要提供第二个参数。where 方法自动正确处理 NULL 比较,无需显式第二个参数。