web-dev-qa-db-fra.com

SQLite - obtenir le nombre de lignes dans une base de données

Je veux obtenir un certain nombre de lignes dans ma table en utilisant max(id). Quand il retourne NULL - s'il n'y a pas de lignes dans la table - je veux retourner 0. Et quand il y a des lignes je veux retourner max(id) + 1.

Mes lignes sont numérotées à partir de 0 et augmentées automatiquement.

Voici ma déclaration:

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

Mais il me renvoie toujours 0. Qu'est-ce que j'ai fait de mal?

45
Ilya Suzdalnitski

Si vous souhaitez utiliser le MAX (id) au lieu du nombre, après avoir lu les commentaires de Pax, le SQL suivant vous donnera ce que vous voulez

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

En SQL, NULL = NULL est faux, vous devez généralement utiliser IS NULL:

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

Mais, si vous voulez le nombre de lignes, vous devez simplement utiliser count(id) puisque votre solution donnera 10 si vos lignes sont (0,1,3,5,9) où elle devrait donner 5.

Si vous pouvez garantir que vous aurez toujours des identifiants de 0 à N, max (id) +1 peut être plus rapide en fonction de la mise en œuvre de l'index (il peut être plus rapide de traverser le côté droit d'un arbre équilibré plutôt que traversant tout l'arbre, en comptant.

Mais c'est très spécifique à l'implémentation et je vous déconseille de vous y fier, notamment parce qu'il verrouille vos performances sur un SGBD spécifique.

9
paxdiablo

Je ne sais pas si je comprends votre question, mais max (id) ne vous donnera pas du tout le nombre de lignes. Par exemple, si vous n'avez qu'une seule ligne avec id = 13 (disons que vous avez supprimé les lignes précédentes), vous aurez max (id) = 13 mais le nombre de lignes est 1. La solution correcte (et la plus rapide) consiste à utiliser compter(). BTW si vous vous demandez pourquoi il y a une étoile, c'est parce que vous pouvez compter les lignes en fonction d'un critère.

4
greg

J'ai le même problème si je comprends bien votre question, je veux connaître le dernier identifiant inséré après chaque performance d'insertion dans l'opération SQLite. j'ai essayé la déclaration suivante:

select * from table_name order by id desc limit 1

L'ID est la première colonne et la clé primaire de la table_name, l'instruction mentionnée me montre l'enregistrement avec l'ID le plus grand.

Mais la prémisse est que vous n'avez jamais supprimé aucune ligne, donc le nombre d'id est égal au nombre de lignes.

2
BOB

Extension de la réponse de VolkerK, pour rendre le code un peu plus lisible, vous pouvez utiliser AS pour référencer le décompte, exemple ci-dessous:

SELECT COUNT(*) AS c from profile

Cela facilite la lecture dans certains cadres, par exemple, j'utilise l'intégration Sqlite d'Exponent (React Native), et sans l'instruction AS, le code est assez moche.

1
Lee Brindley