2010-03-22 11 views
65

Sto usando la classe Active Record di CodeIgniter per interrogare il database MySQL. Ho bisogno di selezionare le righe di una tabella in cui un campo non è impostato su NULL:Interrogare MySQL con CodeIgniter, selezionando le righe dove campo è NULL

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

che restituisce solo che questa interrogazione:

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

Il campo è un campo archivedDATE.

C'è un modo migliore per risolvere questo? So di poter scrivere la query da solo, ma non voglio attenermi all'Active Record nel mio codice.

risposta

116
where('archived IS NOT NULL', null, false) 
+13

Si prega di notare che quando si imposta questo terzo parametro a FALSE, CodeIgniter non cercare di proteggere i nomi dei campi o dei tavoli con i backtick. –

+10

Vale anche la pena aggiungere che è possibile utilizzarlo quando si passa un parametro dell'array: 'where (array (" foo "=>" bar "," archiviato IS NOT NULL "=> null))'. Abbastanza intuitivo ma funziona. – Andrey

5

Null non deve essere impostato su stringa ...

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

Funziona correttamente quando nulla non è avvolto in citazioni.

+1

Questa dovrebbe essere la risposta corretta accettata – GusDeCooL

+3

@GusDeCooL Non è sicuro che funzioni effettivamente. Utilizzando questo output ... "campo NON" senza il NULL. La risposta accettata sembra essere il modo di farlo correttamente. http://ellislab.com/forums/viewthread/119444/#593454 - fornisce più informazioni che potrei mai avere. – andyface

+7

-1 perché non funziona! Ho provato una variazione simile di questo: $ this-> db-> dove ('when_removed is', null); ha dato un errore del database e ha mostrato la query generata inclusa: ... DOVE "when_removed" è ORDER BY "last_name" asc ... –

51

L'Active Record ha sicuramente qualche stranezza. Quando si passa un array alla funzione $this->db->where(), verrà generato un IS NULL. Ad esempio:

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

produce

WHERE `archived` IS NULL 

L'aspetto fastidioso è che non esiste un equivalente per il negativo IS NOT NULL. V'è, tuttavia, un modo per farlo che produce il risultato corretto e sfugge ancora la dichiarazione:

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

produce

WHERE `archived` IS NOT NULL 
+13

+1 perché 'where ('archiviato NON È NULL')' questo protegge ancora gli identificatori e risposta accettata no. –

-2

Un modo per controllare o colonna è nullo o non è

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

in php se la colonna contiene dati, può essere rappresentata come True altrimenti Falso Per utilizzare il confronto multiplo in cui comando e per verificare se i dati della colonna non sono nulli fare come

ecco l'esempio completo di come sono le colonne del filtro nella clausola where (Codeignitor). L'ultimo spettacolo Non NULL compressione

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

Ho appena provato questo e output l'SQL che genera: 'SELECT * FROM (\' test \ ') WHERE \' somebit \ '= '1' AND \' status \ '= 'Pubblicato' AND \' sc_id \ '= 1'. Controllare se una colonna è uguale a 1 e verificare se una colonna non è nulla è estremamente diversa. –

0

molto meglio utilizzare seguente Per non è nullo

dove ('archiviata non è nullo', null);

Per è nullo

dove ('archivio', null);

0

E solo per darti ancora un'altra opzione, puoi usare NOT ISNULL(archived) come filtro WHERE.

0

Codeigniter genera una query "IS NULL" semplicemente lasciando la chiamata senza parametri:

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

La query generato è:

WHERE `column` IS NULL 
+0

OP sta cercando 'IS NOT NULL' not' IS NULL' – AndFisher

4

CodeIgniter 3

Solo

:

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

La query generato è:

WHERE archived IS NOT NULL; 

$ this-> db-> dove ('archiviata non è nullo', nulla, falsa); < < Non necessaria

inverso:

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

La query generato è:

WHERE archived IS NULL; 
+0

Cercavo questo .. grazie! – William

Problemi correlati