Você está no caminho certo. Basta adicionar um
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;
Ou, alternativamente:
ORDER BY ord DESC
Qualquer um destes colocará o
ord = 0
linha por último. EDITAR:
Erwin traz um bom ponto que, da perspectiva do uso do índice, um
OR
no WHERE
cláusula não é a melhor abordagem. Eu modificaria minha resposta para ser: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;
Isso permite que a consulta use dois índices (
street
e ord
). Observe que isso ocorre apenas porque o LIKE
padrão não começa com um curinga. Se o LIKE
padrão começa com um curinga, então essa forma de consulta ainda faria uma varredura completa da tabela.