2009-03-21 5 views
38

Je souhaite obtenir un 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.SQLite - obtention du nombre de lignes dans une base de données

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

Voici ma déclaration:

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

Mais il est toujours me retourne 0. Qu'ai-je fait de mal?

Répondre

13

Si vous souhaitez utiliser le MAX (id) au lieu du compte, après avoir lu les commentaires de Pax alors l'instruction SQL suivante vous donnera ce que vous voulez

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

Intelligent mais ne fonctionne que si vous avez un int intk avec la base 0. La réponse de VolkerK est plus simple et plus efficace. – Rich

+2

@Rich. La réponse de VolkerK est en effet plus simple et est la solution que j'aurais suivie moi-même, cependant, la question indiquait que l'OP voulait utiliser max (id) et que les lignes étaient numérotées de 0 et augmentées automatiquement. –

+1

Vrai et vrai. merci – Rich

209

Vous pouvez interroger le nombre réel de lignes avec

SELECT Count(*) FROM tblName
voir https://www.w3schools.com/sql/sql_count_avg_sum.asp

+1

Cela fonctionnera en effet toujours, mais il nécessite sqlite pour énumérer toutes les lignes de la table. C'est inefficace si le nombre de lignes est grand (> 10 000, disons) – molecule

8

Dans 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ù il doit donner 5.

Si vous ne pouvez vous garantir que vous Ids toujours de 0 à N, max (id) +1 peut être être plus rapide en fonction de l'implémentation de l'index (il peut être plus rapide de parcourir le côté droit d'un arbre équilibré plutôt que de traverser l'arbre entier, en comptant).

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

2

Je suis même problème si je comprends votre question correctement, je veux connaître le dernier id 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 clé primaire de la nom_table, la déclaration mentionnée me montrer le dossier avec le plus grand id.

Mais la prémisse est u ne supprimé une ligne si le nombre d'id égal aux nombres de lignes.

4

Je ne sais pas si je comprends bien votre question, mais max (id) vous ne donnerai pas le nombre de lignes du tout. Par exemple, si vous avez seulement une 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 bonne solution (et la plus rapide) est d'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.

1

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

SELECT COUNT(*) AS c from profile

Cela rend la lecture beaucoup plus facile 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.

Questions connexes