Using MariaDB.
Say you have a table, one of the columns is color
and is the primary key so it’s unique.
I want a select statement to get one row based on color but i want to search for three possible color matches in a preferred order.
A normal WHERE color='red' OR color='blue' OR color='green'
won’t work because that would return multiple rows. I can’t use ORDER BY
and LIMIT
because the three search values are not alphabetical.
I want to search for color='red'
and if there is a red give me just that one row. If there is no red then give me the row that color='blue'
. If there are no red or blue then give me the row with color='green'
. But just to be clear, when searching for the first color red, even if there is a blue and green only return the red because its the preferred match. But if no red then down the line for the next color blue.
I looked at if()
, IF...THEN
and CASE
and didn’t see how to do this. Is there a way?
Advertisement
Answer
You can use an ORDER BY
clause and 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 and Mariadb evaluate boolean expressions like color='red'
as 1 for true
and 0
for false
, so when you sort by color='red' DESC
the row that returns 1 (the row with color='red'
) will be on top and all the others next.
Or, use a CASE
expression:
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;