Вы можете использовать оператор CASE в предложении ORDER BY, чтобы указать порядок, основанный на значениях столбца. Затем используйте 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 для объединения значения по умолчанию «ничего» в результат и также включает столбец «SortOrder». Запросами UNION являются Order By the SortOrder, так что значение по умолчанию сортируется в нижней части результатов, тогда результаты сортируются по длине строки. Наконец, существует предложение LIMIT 1, поэтому значение по умолчанию «ничего» появляется в конечном результате, если это единственная запись, иначе возвращается кратчайшая строка, которая соответствует набору «в группе».
какой сервер и версия сервера вы используете? MySQL? оракул? db2? ms sql? – MrSimpleMind
В настоящее время MySQL – John
ORDER BY FIELD() LIMIT 1 – Strawberry