您可以在 ORDER BY 子句中使用 CASE 语句来指定基于列值的顺序。然后使用可以使用 LIMIT 在结果中只选择一行。
SELECT * FROM foo
WHERE bar IN ('value','value1','value2')
ORDER BY CASE bar WHEN 'value' THEN 1 WHEN 'value1' THEN 2 WHEN 'value2' THEN 3 ELSE 100 END
LIMIT 1;
我在SQL Fiddle上测试了这个例子。
更新:原始发帖人编辑了问题并补充说他想对字符串长度进行排序,如果没有结果,则返回默认值“无”。
SELECT * FROM foo
WHERE bar IN ('value','value1','value2')
ORDER by CASE bar WHEN 'value' THEN 1 WHEN 'value1' THEN 2 WHEN 'value2' THEN 3 ELSE 100 END
LIMIT 1;
SELECT bar FROM
(
SELECT bar, 0 as SortOrder FROM foo
WHERE bar IN ('value','value1','value2')
UNION
SELECT 'nothing' as bar, 999 as SortOrder
) as x
ORDER BY SortOrder, LENGTH(bar)
LIMIT 1;
您可以在SQL Fiddler中看到更新查询运行。
此解决方案通过使用 UNION 将默认值 'nothing' 组合到结果中来工作,并且还包括“SortOrder”列。UNION 的查询是按 SortOrder 列排序的,因此默认值排序到结果的底部,然后结果按条的长度排序。最后有 LIMIT 1 子句,因此如果它是唯一记录,则默认值“无”出现在最终结果中,否则返回“组内”集中匹配的最短字符串。