我在名为“ stockno”的字段上有一个带有VARCHAR(16)PRIMARY键的车辆表。该表有超过9K条记录。我正在尝试开发一个API,如果stockno arg为null,则返回车辆列表,否则它将返回指定的stockno。但是,当我对索引下面的查询运行EXPLAIN时,没有使用。

SET @stockno = 'abc';
SELECT stockno FROM vehicles WHERE CASE WHEN @stockno IS NOT NULL THEN vehicles.stockno = @stockno ELSE 1 = 1 END


我试过了:SELECT stockno FROM vehicles WHERE CASE WHEN @stockno IS NOT NULL THEN vehicles.stockno = CONVERT(@stockno USING latin1) ELSE 1 = 1 END

另外,当我运行SELECT stockno FROM vehicles WHERE stockno = 'abcdef'时,会使用索引。

编辑
该语句最终将用作视图。

最佳答案

您可以更改查询以使用UNION ALL

SET @stockno = 'abc';
SELECT stockno
FROM vehicles
WHERE @stockno IS NOT NULL
AND vehicles.stockno = @stockno
UNION ALL
SELECT stockno
FROM vehicles
WHERE @stockno IS NULL;

关于mysql - 在WHERE子句中使用CASE语句时,MySQL 5.5不使用索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59583451/

10-12 03:43