2012-03-18 32 views
32

¿Es esta la mejor (la más eficiente) forma de comprobar si existe una fila en una tabla?Consulta válida para verificar si existe fila en SQLite3

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag"); 
// Table is... 
// CREATE TABLE myTbl(id INT PRIMARY KEY, u_tag TEXT); 

también lo es el valor de cambio de esto, ¿es falsa (bool) o 0 (int) o NULL?

Respuesta

8

Una vez más, citando the documentation:

El operador EXISTS siempre se evalúa como uno de los valores enteros 0 y 1. Si la ejecución de la instrucción SELECT especificada como el operando de la derecha del operador EXISTE volvería uno o más filas, entonces el operador EXISTS evalúa a 1. Si la ejecución de la instrucción SELECT volvería ninguna fila en absoluto, entonces el operador EXISTS evalúa a 0.

en cuanto a si o no usar EXISTS es más eficiente que, digamos , usando count(*), que puede depende del tamaño de la tabla y si la tabla tiene un índice. Pruebe un EXPLAIN en ambas consultas para comparar (o simplemente medir el tiempo de cada uno de ellos).

61

Desea que se produzca un cortocircuito tan pronto como encuentre uno. Agregar un límite al predicado se asegurará de que.

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag" LIMIT 1); 

La documentación no implica que EXISTS cortocircuitos para usted.

Cualquier cosa que la vuelta debe ser equivalente, aunque teóricamente algo contenido en el índice de que su consulta está utilizando podría teclear directamente en el índice. Regresar 1 es probablemente lo mismo.

Ponga un índice en su campo de etiqueta.

EXISTS afirma que le proporcione 1 o 0, no es nulo.

+0

Al pasar esta consulta sin formato al cursor, ¿cómo puedo obtener 0 o 1 del cursor? ¿Es cursor.getInt (0), cursor.getCount() o cursor.getColumnCount()? –

+3

'EXISTS' siempre devuelve un resultado, por lo que solo funcionaría comprobar el valor. –

+1

Para estar seguro, comprobar el valor de un cursor para un int sería getInt (0) correcto? –

Cuestiones relacionadas