SQL:如何 select 基于一列的单行与具有首选匹配顺序的多个可能值匹配?

SQL: How to select a single row based on a column matched against multiple possible values with preferred match order?

使用 MariaDB。

假设您有一个 table,其中一列是 color 并且是主键,因此它是唯一的。

我想要 select 语句根据颜色获取一行,但我想按首选顺序搜索三种可能的颜色匹配。

普通的 WHERE color='red' OR color='blue' OR color='green' 将不起作用,因为那样会 return 多行。我不能使用 ORDER BYLIMIT,因为这三个搜索值不是按字母顺序排列的。

我想搜索 color='red',如果有红色,请只给我那一行。如果没有红色,则给我 color='blue' 的行。如果没有红色或蓝色,则给我带有 color='green' 的行。但需要明确的是,在搜索第一种颜色红色时,即使有蓝色和绿色也只有 return 红色,因为它是首选匹配项。但是,如果没有红色,则下行选择下一种颜色蓝色。

我查看了 if()IF...THENCASE,但没有看到如何执行此操作。有办法吗?

select *
from (
    select *, 1 as Rank from MyTable where color = 'red'
    union all
    select *, 2 as Rank from MyTable where color = 'blue'
    union all
    select *, 3 as Rank from MyTable where color = 'green'
) x
order by Rank
limit 1

您可以使用 ORDER BY 子句和 LIMIT 1:

WHERE color='red' OR color='blue' OR color='green'
ORDER BY color='red' DESC, 
         color='blue' DESC,
         color='green' DESC -- not actually needed
LIMIT 1;

MySql 和 Mariadb 将 color='red' 之类的布尔表达式计算为 true 的 1 和 0false,因此当您按 [=18 排序时=] returns 1 的行(带有 color='red' 的行)将在最上面,然后是所有其他行。

或者,使用 CASE 表达式:

WHERE color='red' OR color='blue' OR color='green'
ORDER BY CASE color
  WHEN 'red' THEN 1
  WHEN 'blue' THEN 2
  WHEN 'green' THEN 3
END
LIMIT 1;