PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Selecione o primeiro registro se nenhum corresponder


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.