2010-09-29 8 views
7

Chciałbym odfiltrować określone pola w mojej bazie danych, które mają wartość Null, 0 lub "". Niestety, używanie NULL w warunku IN nie zwraca niczego ... Sądzę, że wynika to z NULL porównań w SQL, które są oceniane jako NIEZNANE. Na przykład:Używanie funkcji find i null podczas wyświetlania innych wartości

$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') 
    ) 
); 

to zawsze zwraca żadnych błędów i zero wierszy, ponieważ uzyskana zapytania ma SELECT ... WHERE 'Model'.'related_string' IN (NULL, 0, ''). Jednak jeśli chcę OR oddzielnie dla NULL, nie mogę tego zrobić przy użyciu składni macierzy PHP. Nadpisam wartości. Na przykład:

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

Niepowodzenie. Będzie wyszukiwać tylko wpisy NULL, gdy wartość dla klucza "Model.related_string" zostanie nadpisana. Czy utknąłem, pisząc dwa znaleziska?

+0

http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_in "Aby zachować zgodność ze standardem SQL, IN zwraca NULL nie tylko jeśli wyrażenie po lewej stronie ma wartość NULL, ale także, jeśli nie znaleziono żadnego dopasowania na liście, a jedno z wyrażeń na liście ma wartość NULL. " – Paolo

Odpowiedz

8

Wystarczy owinąć go w jednym więcej tablicy:

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

sugeruję, że jeśli trzeba, że ​​wiele różnych wartości testować przeciw, co należy przede wszystkim zastanowić się, aby ujednolicić je z jednym z możliwych wartość.

+0

To działa. Twoja sugestia jest dobra i musimy mieć standardowe wartości domyślne w przypadku typów łańcuchów i liczb całkowitych. Dziękuję za szybką odpowiedź. – Michael

Powiązane problemy