2009-03-21 20 views
38

Ich möchte eine Reihe von Zeilen in meiner Tabelle mit max(id) erhalten. Wenn es NULL zurückgibt - wenn in der Tabelle keine Zeilen vorhanden sind - möchte ich 0 zurückgeben. Und wenn Zeilen vorhanden sind, möchte ich max(id) + 1 zurückgeben.SQLite - Abrufen der Anzahl der Zeilen in einer Datenbank

Meine Zeilen werden von 0 nummeriert und automatisch erhöht.

Hier ist meine Aussage:

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

Aber es mich immer zurückkehrt 0. Was habe ich falsch gemacht?

Antwort

13

Wenn Sie die MAX (id) anstelle der Zählung verwenden, nachdem die Kommentare von Pax liest dann die folgende SQL wird Ihnen, was Sie

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

Clever, aber funktioniert nur, wenn Sie ein Auto int pk mit Basis 0 haben. Die Antwort von VolkerK ist einfacher und effektiver. – Rich

+2

@Rich. VolkerKs Antwort ist in der Tat einfacher und ist die Lösung, die ich mit mir selbst gegangen wäre, jedoch stellte die Frage, dass das OP max (id) verwenden wollte und dass Zeilen von 0 nummeriert und automatisch erhöht wurden. –

+1

Wahr und wahr. Danke – Rich

209

Sie können die tatsächliche Anzahl der Zeilen abfragen mit

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

+1

Dies wird zwar immer funktionieren, aber es erfordert sqlite, alle Zeilen in der Tabelle aufzulisten. Es ist ineffizient, wenn die Anzahl der Zeilen groß ist (> 10.000, sagen wir mal) – molecule

8

In SQL NULL = NULL falsch ist, Sie in der Regel verwenden IS NULL:

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

Aber, wenn Sie wollen die Anzahl der Zeilen, sollten Sie einfach count(id) verwenden, da Ihre Lösung wird 10 geben, wenn Ihre Zeilen sind (0,1,3,5,9) wo es 5 geben sollte.

Wenn Sie garantieren können, werden Sie immer IDs von 0 zu N, max (id) +1 kann schneller sein, abhängig von der Indeximplementierung (es kann schneller sein, die rechte Seite eines ausgeglichenen Baums zu überqueren, anstatt den ganzen Baum zu durchlaufen, zählend.

Aber das ist sehr umsetzungsspezifische und ich würde davon abraten, darauf angewiesen, nicht zuletzt, weil es Ihre Leistung zu einem bestimmten DBMS sperrt.

2
wollen

Ich habe gleiche Problem, wenn ich Ihr verstehen Frage richtig, ich möchte die letzte eingefügte ID nach jeder Einfügeleistung in SQLite-Operation wissen. Ich habe versucht, die folgende Anweisung:

select * from table_name order by id desc limit 1 

Die ID ist die erste Spalte und Primärschlüssel der table_name, die erwähnte Aussage zeigen Sie mir den Rekord mit der größten ID.

Aber die Prämisse ist, dass Sie nie eine Zeile gelöscht haben, so dass die Zahlen der ID gleich der Anzahl der Zeilen sind.

4

Nicht sicher, ob ich Ihre Frage verstehe, aber max (id) gibt Ihnen die Anzahl der Zeilen überhaupt nicht. Wenn Sie beispielsweise nur eine Zeile mit id = 13 haben (angenommen, Sie haben die vorherigen Zeilen gelöscht), haben Sie max (id) = 13, aber die Anzahl der Zeilen ist 1. Die richtige (und schnellste) Lösung ist zu verwenden Anzahl(). Übrigens, wenn Sie sich fragen, warum es einen Stern gibt, liegt das daran, dass Sie Linien anhand eines Kriteriums zählen können.

1

Erweiterung der VolkerK Antwort, um Code ein wenig mehr lesbar, Sie als die Zählung Referenz verwenden können, zB unter: zum Beispiel

SELECT COUNT(*) AS c from profile

Die in einigen Rahmen für viele leichte Lektüre Ich verwende die Sqlite-Integration von Exponent (React Native), und ohne die AS-Anweisung ist der Code ziemlich hässlich.

Verwandte Themen