Je bent op de goede weg. Voeg gewoon een 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;
Of, afwisselend:
ORDER BY ord DESC
Een van deze zal de ord = 0
. plaatsen rij als laatste.
BEWERKEN:
Erwin brengt een goed punt naar voren dat vanuit het perspectief van indexgebruik een OR
in de WHERE
clausule is niet de beste aanpak. Ik zou mijn antwoord wijzigen in:
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;
Hierdoor kan de query gebruik maken van twee indexen (street
en ord
). Merk op dat dit eigenlijk alleen is omdat de LIKE
patroon begint niet met een jokerteken. Als de LIKE
patroon begint met een jokerteken, dan zou deze vorm van de zoekopdracht nog steeds een volledige tabelscan uitvoeren.