Допустимый запрос, чтобы проверить, существует ли строка в SQLite3 - PullRequest
36 голосов
/ 18 марта 2012

Это лучший (самый эффективный) способ проверить, существует ли строка в таблице?

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag");
// Table is...
// CREATE TABLE myTbl(id INT PRIMARY KEY, u_tag TEXT);

Также, каково возвращаемое значение для этого, является ли оно ложным (bool) или 0 (int) или NULL?

Ответы [ 2 ]

71 голосов
/ 18 марта 2012

Хотя документация не подразумевает этого, очевидно, первичный разработчик sqlite ( Ричард Хипп ) подтвердил в списке рассылки , что EXISTS короткое замыкание для вас.

Планировщик запросов в SQLite, хотя и не блестящий, но достаточно умен, чтобы знать, что он может остановиться и вернуть true, как только увидит первую строку запроса внутри EXISTS ().

Таким образом, предложенный вами запрос будет наиболее эффективным:

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag");

Если вы беспокоитесь о переносимости, вы можете добавить ограничение.Я подозреваю, что большинство БД предложат вам такое же короткое замыкание.

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag" LIMIT 1);

Выбор 1 является принятой практикой, если вам что-то не нужно из записи, хотя то, что вы выбираете, не должно иметь никакого значения в любом случае.

Поместите индекс в поле вашего тега.Если вы этого не сделаете, запрос несуществующего тега выполнит полное сканирование таблицы.

EXISTS указывает, что он вернет 1 или 0, а не ноль.

8 голосов
/ 18 марта 2012

Опять цитируем документацию :

Оператор EXISTS всегда оценивается как одно из целочисленных значений 0 и 1. Если выполнение оператора SELECT, указанного в качестве правого операнда оператора EXISTS, вернет одну или несколько строк, то оператор EXISTS оценивается в 1. Если выполнение SELECT не вернет вообще никаких строк, тогда оператор EXISTS оценивается как 0.

Относительно того, является ли использование EXISTS более эффективным, чем, скажем, использование count(*), это может зависеть от размера таблицы и от того, имеет ли таблица индекс. Попробуйте EXPLAIN в обоих запросах для сравнения (или просто отметьте каждый из них).

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