2010-09-29 51 views
7

我想過濾我的數據庫中的某些字段是空的,0或''。 不幸的是,在IN條件中使用NULL無法返回任何內容...我相信這是由於SQL中的NULL比較評估爲UNKNOWN。例如:使用查找和空值,而OR'ing其他值

$filterField = $this->Model->find('list', array(
    'fields' => array('id','name'), 
    'recursive' => 0, 
    'conditions' => array('Model.related_string' => array(Null, 0, '')), 
    'order' => array('Model.name ASC') 
    ) 
); 

由於生成的查詢具有SELECT ... WHERE 'Model'.'related_string' IN (NULL, 0, ''),因此始終不返回錯誤和零行。但是,如果我想分開OR OR NULL條件,我似乎無法使用PHP的數組語法。我會覆蓋這些值。例如:

  $conditions['OR'] = array(
      'Model.related_string' => array('', 0), 
      'Model.related_string' => NULL); 

失敗。這將只在'Model.related_string'鍵的值被覆蓋時搜索NULL條目。我堅持寫兩個發現?

+0

http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_in 「爲了符合SQL標準,IN不僅返回NULL,而且如果左邊的表達式是NULL,但是如果在列表中找不到匹配,並且列表中的一個表達式爲NULL。「 – Paolo 2013-03-28 16:20:13

回答

8

只是把它包在一個以上的陣列:

$conditions['OR'] = array(
    array('Model.related_string' => array('', 0)), 
    array('Model.related_string' => NULL) 
); 

我建議,如果你有很多不同的值來測試對,你首先應該想到的是他們對標準化一種可能值。

+0

這有效。你的建議很好,而且在字符串和整數類型的情況下,我們確實需要標準化的默認值。感謝您的及時回覆。 – Michael 2010-09-30 15:46:59

相關問題