2011-09-22 18 views
30

Ecco un tipo strano:DOVE: NULL non funziona in SQLite?

posso filtrare su NOT NULLS da SQLite, ma non NULLS:

questo funziona:

SELECT * FROM project WHERE parent_id NOT NULL; 

Questi non fanno:

SELECT * FROM project WHERE parent_id IS NULL; 
SELECT * FROM project WHERE parent_id ISNULL; 
SELECT * FROM project WHERE parent_id NULL; 

Tutti i resi:

There is a problem with the syntax of your query (Query was not executed) ...

UPDATE:

Sto facendo questo con PHP-attraverso il mio codice con ezSQl e utilizzando l'interfaccia di PHPLiteAdmin

Utilizzando la PHPLiteAdmin demo, questa espressione works- così ora sto sospettando un problema di versione con SQLite del mio PHP? Potrebbe essere? Questa espressione non era sempre valida?

UPDATE 2:

Quando eseguo il codice PHP utilizzando ezSQL, l'avviso PHP è:

PHP Warning: SQL logic error or missing database

C'è un modo per ottenere più informazioni da PHP? Questo è esasperatamente opaco e strano, soprattutto perché la stessa dichiarazione nella CLI funziona bene ...

UPDATE 3

L'unico altro possibile indizio che ho è che le basi di dati che creo con PHP non possono essere letto dalla CLI e viceversa. Ottengo:

Error: file is encrypted or is not a database

Quindi ci sono sicuramente due gusti SQlite butting teste qui. (See this) Ancora, perché la dichiarazione non valida ??

AGGIORNAMENTO 4

OK Credo di aver rintracciato il problema per il colpevole, se non il ragionevole Il DB che ho creato con PHP ezSQL è quello in cui la dichiarazione IS NULL non riesce. Se creo il DB utilizzando la classe SQLite3 di PHP, l'istruzione funziona correttamente e, inoltre, posso accedere al DB dalla CLI, mentre il DB creato da ezSQL ha dato l'errore file is encrypted.

Così ho fatto un po 'di scavo nel codice ezSQL. Al di fuori del blocco vedo che usa i metodi PDO, non la più recente classe SQLite3. Forse è qualcosa - non sprecherò altro tempo su di esso ...

In ogni caso, ho trovato la mia soluzione, che è di stare lontano da ezSQL, e basta usare la classe SQLite3 di PHP.

+4

Il tuo primo 'è la sintassi NULL' è corretta. In questo caso dovrai darci un'idea di come inviare questo comando a SQLite. Questo messaggio di errore non sembra provenire dall'interfaccia della riga di comando sqlite3. –

+0

Larry- through PHP- utilizzando phpliteadmin http://www.danedesigns.com/phpliteadmin.php e nel mio codice php con ezsql – Yarin

+1

La mia ipotesi è che PHPLiteAdmin stia segnalando erroneamente qualche altro problema.Potrebbe essere un file di database mancante o errato o qualsiasi altra cosa. –

risposta

41

a IS b e a IS NOT b è la forma generale in cui a e b sono espressioni.

Questo è generalmente visto solo nei casi a IS NULL e a IS NOT NULL. Ci sono anche ISNULL e NOTNULL (anche NOT NULL) gli operatori che sono rispettivamente short-hands per le espressioni precedenti (prendono solo un singolo operando).

L'SQL compreso nelle espressioni SQLite è trattato in SQLite Query Language: Expressions.

Assicurarsi che le (precedenti) istruzioni siano state terminate con un ; prima se si utilizza la CLI.

Questi sono tutti validi per negare un "match nullo":

expr NOT NULL 
expr NOTNULL 
expr IS NOT NULL 

Questi sono tutti validi per "match nullo":

expr ISNULL 
expr IS NULL 

Poiché tutte le costruzioni di cui sopra sono essi stessi espressioni anche le negazioni sono valide (ad es. NOT (expr NOT NULL) equivale a expr IS NULL).

Felice codifica.


La prova nel budino:

SQLite version 3.7.7.1 2011-06-28 17:39:05 
Enter ".help" for instructions 
Enter SQL statements terminated with a ";" 
sqlite> create table x (y int null); 
sqlite> select * from x where y isnull; 
sqlite> select * from x where y notnull; 
sqlite> select * from x where y not null; 
sqlite> select * from x where y is null; 
sqlite> select * from x where y is not null; 
sqlite> 
+1

@ pst- Apprezzo la risposta ma IS NULL non funziona. Le mie affermazioni sono ben delimitate, come prova dal fatto che l'espressione IS NOT NULL funziona. So cosa dicono i documenti, ma questi sono i risultati che sto ottenendo ... – Yarin

+0

@ pst- Se c'è qualche aiuto, sto eseguendo questi attraverso PHP ezsql – Yarin

+0

@Yarin Quale versione di SQLite? Ho aggiornato la mia risposta mostrando che funziona come previsto (nella mia versione). L'unica cosa che è * molto sospetta * è che 'x IS NULL'" non funziona ". –

1

Questo funziona su SQLite in SQLite Manager per Firefox:

  select * from foo where not baz is not null 

La query sopra restituisce le righe in cui colonna [baz] è nullo. :-) Yarin, forse funzionerà per te? (Il 'non' prima che il nome della colonna non sia un refuso).

Questa query trova troppo le righe in cui baz è nullo: (?)

  select * from foo where [baz] is null 
+0

Qual è il tipo di dati esatto (verbatim, come dichiarato nell'istruzione CREATE TABLE) della colonna che stai cercando di verificare per null? – Tim

0

Se si sta testando forse la colonna PK e la colonna viene trattato come sinonimo di rowid, quindi nessuna riga avranno un rowid è nulla.

7

Il problema potrebbe derivare da come SQLite gestisce le colonne vuote. Ad esempio, solo perché una colonna è vuota non significa che sia NULL. Hai provato contro ""?

SELECT * FROM project WHERE parent_id = "" 

Questa query potrebbe restituire risultati.

+0

+1 parent_id = "" e parent_id <> "" funzionerà sempre –

5

In Android SQLite, il campo IS NULL non funziona neanche.

field = 'null' fa. Fate una prova nel proprio ambiente

+0

Strano ... Ho appena scoperto che in alcuni casi * dove il campo è nullo * funziona. –

+1

Nel mio caso il tipo di colonna era INTEGER. Emulatore Android API15 nome_colonna = 0 lavorato. Telefono API15 Android nome_colonna ISNULL (e IS NULL) ha funzionato. Spero che aiuti qualcun altro. –

0

prova dove your_col_name ISNULL wheres ISNULL non contiene spazio

Problemi correlati