当我写一个sql时 SELECT * FROM table WHERE table.col && object
,我可以使用我构建的索引(因为它支持&&operator),但是
SELECT * FROM table WHERE
CASE
WHEN table.col && object = true THEN true
ELSE false
END
我好像不能用索引?
这是什么原因?有办法解决吗?实际上我想实现一个逻辑 CASE WHEN a&&b = true THEN a<b ELSE a>b END
在索引的支持下,这是可能的吗?
3条答案
按热度按时间7rfyedvj1#
我猜不存在
case
表达式将在postgres中使用索引。这是因为case
表达式强制执行求值顺序——一旦涉及到索引,就很难确保求值顺序。在编译器识别出
case
表达式是冗余的,在优化阶段之前会被删除。也就是说,你的case表达式是无用的。只需使用:
笔记:
布尔和的sql标准是
AND
. 使用它。= true
是多余的。你可以把它包括在内,但这不是必须的。有两个布尔列。在许多情况下,索引即使可用也不会被使用,因为列(可能)不是很有选择性。
mo49yndu2#
你甚至不需要使用
CASE
此处的表达式:也就是说,我很惊讶索引不能被使用,因为一般来说,您的逻辑可能可以被优化到类似于上面的东西,而不需要一个索引
CASE
表情。lhcgjxsq3#
你的问题不太清楚,但根据假设,你可以这样做
选择case when table.col&&object=true,然后选择true,否则选择false,从表中以“temp”表结束
然后可以创建聚集/非聚集索引
在表#temp_table()上创建索引idx_col
然后可以选择结果:
从#temp_表中选择*,其中=