2011-09-22 29 views
30

Aquí es extraña:DÓNDE - ¿NULL no funciona en SQLite?

puedo filtrar en NOT NULLS de SQLite, pero no NULLS:

esto funciona:

SELECT * FROM project WHERE parent_id NOT NULL; 

Estos no hacen:

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

Todos devuelven:

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

ACTUALIZACIÓN:

que estoy haciendo esto con PHP a través de mi código con ezSQl y el uso de la interfaz PHPLiteAdmin

Utilizando el PHPLiteAdmin demo, esta expresión funciona- así que ahora estoy sospechando un problema de versión con mi SQLite de PHP? ¿Podría ser eso? ¿No era esta expresión siempre válida?

ACTUALIZACIÓN 2:

Cuando ejecuto el código de PHP usando ezSQL, la advertencia es PHP:

PHP Warning: SQL logic error or missing database

¿Hay una manera de obtener más información de PHP? Esto es desesperante opaco y extraño, sobre todo debido a que la misma declaración en la CLI funciona bien ...

ACTUALIZACIÓN 3

La única otra posible pista que tengo es que las bases de datos que he creado con PHP no pueden estar leído por la CLI, y viceversa. Obtengo:

Error: file is encrypted or is not a database

Así que hay definitivamente dos sabores de SQlite embistiendo aquí. (See this) Aún así, ¿por qué la declaración inválida?

ACTUALIZACIÓN 4

bien creo que he rastreado el problema para el culpable, si no el razonable El DB he creado con PHP ezSQL es aquel en el que es la declaración NULL falla. Si creo el DB usando la clase SQLite3 de PHP, la declaración funciona bien, y además, puedo acceder al DB desde el CLI, mientras que el DB creado por ezSQL dio el error file is encrypted.

Así que profundicé un poco en el código ezSQL- Aparece el Bat. Veo que usa métodos PDO, no la clase SQLite3 más nueva. Tal vez eso es algo, no voy a perder más tiempo en ello ...

En cualquier caso, he encontrado mi solución, que es alejarse de ezSQL, y simplemente usar la clase PHPs SQLite3.

+4

Su primera 'ES sintaxis null' es correcta. En este caso, deberá darnos una idea de cómo está enviando ese comando a SQLite. Ese mensaje de error no parece venir de la interfaz de línea de comandos sqlite3. –

+0

Larry-through PHP- usando phpliteadmin http://www.danedesigns.com/phpliteadmin.php y en mi código php con ezsql – Yarin

+1

Supongo que PHPLiteAdmin está informando erróneamente algún otro problema.Podría ser un archivo de base de datos faltante o mal ubicado, o cualquier otra cosa. –

Respuesta

41

a IS b y a IS NOT b es la forma general donde a y b son expresiones.

Esto generalmente solo se ve en a IS NULL y a IS NOT NULL casos. También hay operadores ISNULL y NOTNULL (también NOT NULL) que son short-hands para las expresiones anteriores, respectivamente (solo aceptan un solo operando).

El SQL entendido en expresiones SQLite se trata en SQLite Query Language: Expressions.

Asegúrese de que las declaraciones (anteriores) hayan terminado con un ; primero si utiliza la CLI.

Estos son todos válidos para negar un "partido nulo":

expr NOT NULL 
expr NOTNULL 
expr IS NOT NULL 

Estas son todas válidas a "nulo partido":

expr ISNULL 
expr IS NULL 

Puesto que todas las construcciones anteriores son en sí mismas expresiones del las negaciones también son válidas (por ejemplo, NOT (expr NOT NULL) es equivalente a expr IS NULL).

Happy coding.


La prueba en el pudín:

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- Agradezco la respuesta, pero IS NULL no funciona. Mis declaraciones están bien delimitadas, como evidencia por el hecho de que la expresión IS NOT NULL funciona. Sé lo que dicen los documentos, pero estos son los resultados que obtengo ... – Yarin

+0

@ pst- Si es de alguna ayuda, estoy ejecutando estos a través de PHP ezsql – Yarin

+0

@Yarin ¿Qué versión de SQLite? He actualizado mi respuesta mostrando que funciona como se esperaba (en mi versión). Lo único que es * muy sospechoso * es que 'x IS NULL'" no funciona ". –

1

Esto funciona en SQLite SQLite Manager para Firefox:

  select * from foo where not baz is not null 

La consulta anterior devuelve filas donde la columna [Baz] es nulo. :-) Yarin, ¿tal vez te funcione? (El 'no' antes del nombre de la columna no es un error tipográfico).

Esta consulta también se encuentra filas donde Baz es nulo: (?)

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

¿Cuál es el tipo de datos exacto (palabra por palabra, según lo declarado en su declaración CREATE TABLE) de la columna que está tratando de probar nulo? – Tim

0

Si está probando quizá la columna de PK y la columna está siendo tratado como sinónimo de rowid, entonces no hay filas tendrán un rowid eso es nulo.

7

El problema podría deberse a cómo SQLite maneja las columnas vacías. Por ejemplo, solo porque una columna esté vacía no significa que sea NULL. ¿Has probado contra ""?

SELECT * FROM project WHERE parent_id = "" 

Esa consulta puede arrojar resultados.

+0

+1 parent_id = "" y parent_id <> "" siempre funcionará –

5

En Android SQLite, el campo IS NULL tampoco funciona.

campo = 'nulo' hace. Darle una oportunidad en su entorno

+0

Weird ... Acabo de encontrar que en algunos casos * donde el campo es nulo * funciona. –

+1

En mi caso, el tipo de columna era INTEGER. Android API15 emulator column_name = 0 trabajado. Android API15 teléfono column_name ISNULL (e IS NULL) funcionó. Espero que ayude a alguien más. –

0

intento donde your_col_name ISNULL wheres ISNULL contiene ningún espacio

Cuestiones relacionadas