Подтвердить что ты не робот

SQLite - получение количества строк в базе данных

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 3

В SQL, NULL = NULL является ложным, вам обычно нужно использовать 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

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

Ответ 5

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

select * from table_name order by id desc limit 1

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

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

Ответ 6

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

SELECT COUNT(*) AS c from profile

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