У меня есть таблица foo и табличная панель, где каждый foo может иметь панель (а панель может принадлежать нескольким foos).Условные подзапросы оптимизированы, если условие ложно?
Теперь мне нужно выбрать все foos с баром. Мой sql выглядит так:
SELECT *
FROM foo f
WHERE [...]
AND ($param IS NULL OR (SELECT ((COUNT(*))>0)
FROM bar b
WHERE f.bar = b.id))
с заменой $ param во время выполнения.
Вопрос: будет ли выполняться подзапрос, даже если параметр равен null или будет ли dbms оптимизировать подзапрос?
Мы используем mysql, mssql и oracle. Есть ли разница между ними в отношении вышеизложенного?
Я не рекомендую этот подход, ради что вы будете герметизирующего три (или больше) синтаксис баз данных, который будет расходиться. IE: MySQL поддерживает LIMIT, который ни SQL Server, ни Oracle не делают - SQL Server использует TOP, в то время как Oracle использует ROWNUM. Или используйте технологию абстракции базы данных, такую как Hibernate/etc, чтобы вы не обременялись кодированием самого SQL или сами использовали хранимую процедуру/функцию каждой базы данных для кодирования и настройки запросов для каждого. –
Чтобы уточнить, мой псевдокод 'if ... else ... end if' предназначен для использования в прикладном уровне, а не в SQL. Я не рекомендую добавлять сложность SQL, на самом деле я думаю, что SQL должен быть упрощен. Основной момент, который я делал, заключается в том, что если у вас есть простой условный параметр, такой как '$ param is null ', вам, вероятно, лучше переместить это из SQL и в прикладной уровень. Это должно работать независимо от того, использует ли OP Hibernate и т. Д. Или пишет прямой SQL. –
Да, мы используем слой абстракции db, домашний, с так называемыми именованными запросами, которые записываются в xml-файлы и доступны из нашего кода. Параметры передаются из кода, а sql генерируется уровнем абстракции. Поэтому самый простой способ - использовать вид ($ param - null || $ param == ...), как я сделал в примере. Единственный недостаток до сих пор заключался в том, что полученный sql загроможден нулевым значением null ... что мешает отладке бит, но до сих пор никогда не было проблемой производительности - до сих пор, когда мне нужно условное соединение. –