Как получить индекс, используемый с OR в заявлении - PullRequest
0 голосов
/ 30 августа 2018

У меня SQL с параметрами, переданными пользователем. Пользователь может передать некоторый идентификатор или -1, что означает «неважно». Можно написать запрос, как показано ниже, но можно использовать индекс?

SELECT *
FROM table
WHERE
    ((col1 = :param1) OR (:param1 = -1))
    AND ((col2 = :param2) OR (:param2 = -1))
    AND col3 STARTING 'A'

col1, col2 и col3 проиндексированы. В FB 2.x при использовании OR никогда не используйте индекс для col1 или col2. В FB 3, только если существуют первые (или вторые) условия, которые могут использовать индекс (индекс PLAN и натуральный), но с последним условием прекратите использовать индекс для col1 / 2.

Как я могу написать SQL без использования PLAN и использовать индекс для col1/2 и оставить возможность "выключить" условие, передав -1?

1 Ответ

0 голосов
/ 30 августа 2018

Вы можете переписать условие как

(col1 = :param1) OR (:param1 = -1)

как

col1 = case when :param1 = -1 then col1 else :param1 end

Поскольку это одно выражение, вы также можете безопасно удалить все скобки, что облегчает чтение запроса.

...