Обрабатываются ли строки, даже если один параметр запроса всегда имеет значение false - PullRequest
0 голосов
/ 24 июня 2019

Вот оператор SQL для Sqlite и Android's Room, хотя это действительно относится к SQL в целом:

SELECT rowid, firstName, lastName, photoUrl, occupation, summary
FROM Connections
WHERE (:wordCriteria != "") AND title MATCH :wordCriteria

В предложении WHERE wordCriteria на самом деле является параметром, который устанавливается перед выполнением запроса. Если установлено значение "", запрос не вернет никаких результатов. Но даже если это "", означает ли это, что все строки обрабатываются так или иначе, или базовый код в базе данных распознает выражение:

wordCriteria != ""

будет ложным и не мешает обрабатывать строки?

Если все строки будут прочитаны в любом случае, есть ли способ предотвратить их чтение, если wordCriteria равен ""? Я не хочу выполнять запрос, если для wordCriteria установлено значение "".

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Невозможно сказать.

SQL является декларативным языком, а не императивным. Это означает, что вы указываете что вы хотите, а не как сделать это. Планировщик SQL и оптимизатор SQL бесплатны , чтобы выбрать любую опцию для оценки и оценки ваших предикатов. Вы не можете это контролировать. А почему бы тебе это важно?

Хорошие оптимизаторы, вероятно, обнаружат случай, о котором вы говорите, а плохие оптимизаторы - нет.

0 голосов
/ 24 июня 2019

Как правило, базовая база данных будет сканировать всю таблицу Connections, даже если предложение WHERE пытается сопоставить title с пустой строкой.Если вы хотите полностью избежать запроса из своего Java-кода, то проще всего будет просто использовать оператор if, который делает именно это:

if (!"".equals(wordCriteria)) {
    // then run your query
}
else {
    // the result set would logically default to being empty
}

Вы также можете проверить, есть ли словокритерии будут нулевыми или пустыми, используя что-то вроде StringUtils#isNullOrEmpty из библиотеки Apache.

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