2009-03-21 12 views
38

Quiero obtener un número de filas en mi tabla usando max(id). Cuando devuelve NULL - si no hay filas en la tabla - Quiero devolver 0. Y cuando hay filas, quiero devolver max(id) + 1.SQLite - obteniendo el número de filas en una base de datos

Mis filas se numeran desde 0 y se aumentan automáticamente.

aquí está mi declaración:

SELECT CASE WHEN MAX(id) != NULL THEN (MAX(id) + 1) ELSE 0 END FROM words 

Pero siempre me está volviendo 0. ¿Qué he hecho mal?

Respuesta

13

Si desea utilizar el MAX (id) en lugar de la cuenta, después de leer los comentarios de Pax entonces el siguiente código SQL le dará lo que quiere

SELECT COALESCE(MAX(id)+1, 0) FROM words 
+1

Inteligente, pero solo funciona si tiene un auto int pk con base 0. La respuesta de VolkerK es más simple y más efectiva. – Rich

+2

@Rich. La respuesta de VolkerK es, de hecho, más simple y es la solución que habría elegido para mí, sin embargo, la pregunta decía que el OP quería usar max (id) y que las filas estaban numeradas de 0 y automáticas. –

+1

Verdadero y verdadero. gracias – Rich

8

En SQL, NULL = NULL es falso, por lo general tiene que utilizar IS NULL:

SELECT CASE WHEN MAX(id) IS NULL THEN 0 ELSE (MAX(id) + 1) END FROM words 

Pero, si quieres el número de filas, solo debe usar count(id) ya que su solución dará 10 si sus filas son (0, 1, 3, 5, 9) donde debería dar 5.

Si puede garantizar que siempre tendrá identificadores de 0 para N, max (id) +1 puede ser más rápido dependiendo de la implementación del índice (puede ser más rápido atravesar el lado derecho de un árbol balanceado en lugar de atravesar todo el árbol, contando.

Pero eso es muy específico de la implementación y recomendaría no confiar en él, sobre todo porque bloquea su rendimiento a un DBMS específico.

2

Tengo mismo problema si entiendo su pregunta correcta, quiero saber la última identificación insertada después de cada actuación de inserción en la operación de SQLite. Probé la siguiente declaración:

select * from table_name order by id desc limit 1 

El id es la primera columna y la clave primaria de la nombre_tabla, la declaración mencionada muéstrame el registro con el mayor ID.

Pero la premisa es que nunca se elimina ninguna fila por lo que los números de identificación son iguales a los números de las filas.

4

No estoy seguro si entiendo su pregunta, pero max (id) no le proporcionará el número de líneas. Por ejemplo, si tiene solo una línea con id = 13 (digamos que borró las líneas anteriores), tendrá max (id) = 13 pero el número de filas es 1. La solución correcta (y más rápida) es usar contar(). Por cierto, si te preguntas por qué hay una estrella, es porque puedes contar líneas según un criterio.

1

extensión de la respuesta de VolkerK, para hacer que el código un poco más legible, se puede utilizar como para hacer referencia al recuento, el siguiente ejemplo:

SELECT COUNT(*) AS c from profile

Esta es una lectura mucho más fácil en algunos marcos, por ejemplo, , estoy usando la integración Sqlite de Exponent (React Native), y sin la declaración AS, el código es bastante feo.

Cuestiones relacionadas