PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Sélectionnez le premier enregistrement si aucun ne correspond

Tu es sur la bonne piste. Ajoutez simplement un 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, alternativement :

ORDER BY ord DESC

L'un ou l'autre mettra le ord = 0 ligne en dernier.

MODIFIER :

Erwin soulève un bon point que du point de vue de l'utilisation de l'index, un OR dans le WHERE clause n'est pas la meilleure approche. Je modifierais ma réponse pour être :

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;

Cela permet à la requête d'utiliser deux index (street et ord ). Notez que c'est vraiment uniquement parce que le LIKE pattern ne commence pas par un caractère générique. Si le LIKE modèle commence par un caractère générique, alors cette forme de requête effectuerait toujours une analyse complète de la table.