Du är på rätt väg. Lägg bara till en order by
:
SELECT street, zip, city
FROM address
WHERE street LIKE 'Test%' OR ord = 0
ORDER BY (CASE WHEN street LIKE 'Test%' THEN 1 ELSE 0 END) DESC
LIMIT 1;
Eller alternativt:
ORDER BY ord DESC
Båda dessa sätter ord = 0
rad sist.
EDIT:
Erwin tar upp en bra poäng att ur indexanvändningens perspektiv är en OR
i WHERE
klausul är inte det bästa tillvägagångssättet. Jag skulle ändra mitt svar till att vara:
SELECT *
FROM ((SELECT street, zip, city
FROM address
WHERE street LIKE 'Test%'
LIMIT 1
)
UNION ALL
(SELECT street, zip, city
FROM address
WHERE ord = 0
LIMIT 1
)
) t
ORDER BY (CASE WHEN street LIKE 'Test%' THEN 1 ELSE 0 END) DESC
LIMIT 1;
Detta gör att frågan kan använda två index (street
och ord
). Observera att detta egentligen bara beror på att LIKE
mönstret börjar inte med ett jokertecken. Om LIKE
mönstret börjar med ett jokertecken, sedan skulle den här formen av frågan fortfarande göra en fullständig tabellskanning.