SQLite - получение количества строк в базе данных - PullRequest
43 голосов
/ 21 марта 2009

Я хочу получить количество строк в моей таблице, используя max(id). Когда он возвращает NULL - если в таблице нет строк - я хочу вернуть 0. А когда есть строки, я хочу вернуть max(id) + 1.

Мои строки нумеруются с 0 и автоматически увеличиваются.

Вот мое утверждение:

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

Но это всегда возвращает мне 0. Что я сделал не так?

Ответы [ 6 ]

233 голосов
/ 21 марта 2009

Вы можете запросить фактическое количество строк с помощью

SELECT Count(*) FROM tblName
см https://www.w3schools.com/sql/sql_count_avg_sum.asp
13 голосов
/ 21 марта 2009

Если вы хотите использовать MAX (id) вместо счетчика, после прочтения комментариев от Pax, следующий SQL даст вам то, что вы хотите

SELECT COALESCE(MAX(id)+1, 0) FROM words
9 голосов
/ 21 марта 2009

В SQL NULL = NULL - false, обычно вам нужно использовать IS NULL:

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

Но, если вы хотите количество строк, вы должны просто использовать count(id), так как ваше решение даст 10, если ваши строки (0,1,3,5,9), где оно должно дать 5.

Если вы можете гарантировать, что у вас всегда будут идентификаторы от 0 до N, max (id) +1 может быть быстрее в зависимости от реализации индекса (возможно, быстрее пройти по правой стороне сбалансированного дерева а не пересекать целое дерево, считая.

Но это очень зависит от реализации, и я бы не советовал полагаться на нее, не в последнюю очередь потому, что она привязывает вашу производительность к конкретной СУБД.

4 голосов
/ 17 августа 2011

Не уверен, что я понимаю ваш вопрос, но max (id) не даст вам количество строк вообще. Например, если у вас есть только одна строка с id = 13 (скажем, вы удалили предыдущие строки), у вас будет max (id) = 13, но количество строк равно 1. Правильное (и самое быстрое) решение - использовать кол-(). Кстати, если вам интересно, почему есть звезда, это потому, что вы можете считать линии на основе критериев.

2 голосов
/ 23 февраля 2011

У меня та же проблема, если я правильно понимаю ваш вопрос, я хочу знать последний вставленный идентификатор после каждой производительности вставки в операции SQLite. я попробовал следующее утверждение:

select * from table_name order by id desc limit 1

Идентификатор - это первый столбец и первичный ключ table_name, упомянутое утверждение покажет мне запись с наибольшим идентификатором.

Но при условии, что вы никогда не удаляете ни одну строку, поэтому числа id равны номерам строк.

1 голос
/ 01 октября 2017

Расширение ответа VolkerK, чтобы сделать код немного более читабельным, вы можете использовать AS для ссылки на счет, пример ниже:

SELECT COUNT(*) AS c from profile

Это облегчает чтение в некоторых средах, например, я использую интеграцию Exponent (React Native) Sqlite, и без оператора AS код довольно уродливый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...