"CASE WHEN" 在带有索引列的 WHERE 子句中

"CASE WHEN" in WHERE clause with indexed columns

我在 WHERE 子句中有一个带有 CASE WHEN 条件的函数。简单(非常简单)看起来像这样:

SELECT *
FROM mytable t
WHERE (
   CASE aPARAM WHEN 'a' THEN t.a = aID
               WHEN 'b' THEN t.b = aID
               WHEN 'c' THEN t.c = aID
               ELSE TRUE END
)

aPARAMaID - 函数参数

abc - table 的索引列"mytable"

但在这种情况下 MySQL 根本不使用索引。

是的,此查询包含 select 另一个条件的条件,但它不依赖于结果值,可以在查询执行之前计算(定义)。

建议这个函数使用索引有什么用?

大小写是 MySQL 不能使用索引的表达式。尝试将案例转换为一堆 or 条件,如下所示:

SELECT *
FROM mytable t
WHERE (t.a = aID and aPARAM = 'a')
or (t.b = aID and aPARAM = 'b')
or (t.c = aID and aPARAM = 'c')
or (aPARAM not in ('a','b','c'))