2010-09-29 12 views
7

Me gustaría filtrar ciertos campos en mi base de datos que son nulos, 0 o ''. Desafortunadamente, al usar NULL en una condición IN no se puede devolver nada ... Creo que esto se debe a las comparaciones NULL en SQL que se evalúan como UNKNOWN. Por ejemplo:Usando find y null mientras ordeando otros valores

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

Esto siempre devuelve ningún error y cero filas porque la consulta resultante tiene SELECT ... WHERE 'Model'.'related_string' IN (NULL, 0, ''). Sin embargo, si quiero O la condición NULL por separado, parece que no puedo hacerlo con la sintaxis de matriz de PHP. Sobreescribiré los valores. Por ejemplo:

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

Fracaso. Esto solo buscará entradas NULL cuando se sobrescriba el valor de la clave 'Model.related_string'. ¿Estoy atrapado escribiendo dos hallazgos?

+0

http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_in "Para cumplir con el estándar SQL, IN devuelve NULL no solo si la expresión en el lado izquierdo es NULL, pero también si no se encuentra ninguna coincidencia en la lista y una de las expresiones en la lista es NULL. " – Paolo

Respuesta

8

Sólo se envuelve en una mayor variedad:

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

me gustaría sugerir que si tiene que muchos valores diferentes para poner a prueba en contra, lo que se debe, ante todo, pensar es normalizarlos a una posible valor.

+0

Esto funciona. Su sugerencia es buena, y necesitamos tener valores predeterminados estandarizados en el caso de los tipos de cadena y número entero. Gracias por su rápida respuesta. – Michael

Cuestiones relacionadas