带case条件的sql能否在postgresql中使用索引?

tcbh2hod  于 2021-08-13  发布在  Java
关注(0)|答案(3)|浏览(342)

当我写一个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 在索引的支持下,这是可能的吗?

7rfyedvj

7rfyedvj1#

我猜不存在 case 表达式将在postgres中使用索引。这是因为 case 表达式强制执行求值顺序——一旦涉及到索引,就很难确保求值顺序。
在编译器识别出 case 表达式是冗余的,在优化阶段之前会被删除。
也就是说,你的case表达式是无用的。只需使用:

SELECT *
FROM table
WHERE table.col AND object ;

笔记:
布尔和的sql标准是 AND . 使用它。 = true 是多余的。你可以把它包括在内,但这不是必须的。
有两个布尔列。在许多情况下,索引即使可用也不会被使用,因为列(可能)不是很有选择性。

mo49yndu

mo49yndu2#

你甚至不需要使用 CASE 此处的表达式:

SELECT *
FROM yourTable
WHERE (some_condition AND a < b) OR (!some_condition AND a > b);

也就是说,我很惊讶索引不能被使用,因为一般来说,您的逻辑可能可以被优化到类似于上面的东西,而不需要一个索引 CASE 表情。

lhcgjxsq

lhcgjxsq3#

你的问题不太清楚,但根据假设,你可以这样做
选择case when table.col&&object=true,然后选择true,否则选择false,从表中以“temp”表结束
然后可以创建聚集/非聚集索引
在表#temp_table()上创建索引idx_col
然后可以选择结果:
从#temp_表中选择*,其中=

相关问题