我有带有用户传递的参数的SQL。用户可以传递一些id或-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使用索引。
如何在不使用PLAN的情况下编写SQL,如何为col1/2
使用索引,并通过传递-1
保持“关闭”状态的可能性?
答案 0 :(得分:0)
您可以重写类似条件
(col1 = :param1) OR (:param1 = -1)
为
col1 = case when :param1 = -1 then col1 else :param1 end
由于它是单个表达式,因此您也可以安全地删除所有方括号,这使查询更易于阅读。