您可以在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上測試了這個例子。
更新:原始海報編輯了這個問題,並補充說,他想按字符串長度進行排序,如果沒有結果,則返回默認值'nothing'。
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的查詢是Order By SortOrder列,以便將默認值排序到結果的底部,然後結果按條的長度排序。最後,有LIMIT 1子句,所以如果最終結果是唯一記錄,那麼缺省值'nothing'將出現,否則返回'in group'集合中匹配的最短字符串。
你使用什麼數據庫服務器和版本? MySQL的?甲骨文? DB2? MS SQL? – MrSimpleMind
當前MySQL – John
ORDER BY FIELD()LIMIT 1 – Strawberry