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 BY
和 LIMIT
,因为这三个搜索值不是按字母顺序排列的。
我想搜索 color='red'
,如果有红色,请只给我那一行。如果没有红色,则给我 color='blue'
的行。如果没有红色或蓝色,则给我带有 color='green'
的行。但需要明确的是,在搜索第一种颜色红色时,即使有蓝色和绿色也只有 return 红色,因为它是首选匹配项。但是,如果没有红色,则下行选择下一种颜色蓝色。
我查看了 if()
、IF...THEN
和 CASE
,但没有看到如何执行此操作。有办法吗?
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 和 0
的 false
,因此当您按 [=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;
使用 MariaDB。
假设您有一个 table,其中一列是 color
并且是主键,因此它是唯一的。
我想要 select 语句根据颜色获取一行,但我想按首选顺序搜索三种可能的颜色匹配。
普通的 WHERE color='red' OR color='blue' OR color='green'
将不起作用,因为那样会 return 多行。我不能使用 ORDER BY
和 LIMIT
,因为这三个搜索值不是按字母顺序排列的。
我想搜索 color='red'
,如果有红色,请只给我那一行。如果没有红色,则给我 color='blue'
的行。如果没有红色或蓝色,则给我带有 color='green'
的行。但需要明确的是,在搜索第一种颜色红色时,即使有蓝色和绿色也只有 return 红色,因为它是首选匹配项。但是,如果没有红色,则下行选择下一种颜色蓝色。
我查看了 if()
、IF...THEN
和 CASE
,但没有看到如何执行此操作。有办法吗?
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 和 0
的 false
,因此当您按 [=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;