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

Действительный запрос, чтобы проверить, существует ли строка в SQLite3

Является ли это лучшим (наиболее эффективным) способом проверки наличия строки в таблице?

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

Также каково значение возвращаемого значения для него: false (bool) или 0 (int) или NULL?

4b9b3361

Ответ 1

Вы хотите, чтобы он коротко замыкался, как только он его нашел. Добавление предела к предикату гарантирует, что.

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

Документация не означает, что EXISTS коротких замыканий для вас.

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

Поместите индекс в поле вашего тега.

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

Ответ 2

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

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

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