sql >> Database >  >> RDS >> PostgreSQL

Selecteer eerste record als er geen overeenkomen

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.



  1. Meerdere plannen voor een identieke zoekopdracht

  2. SQL-volgorde per telling

  3. PostgreSQL-index niet gebruikt voor query's op IP-bereiken

  4. Bulksgewijs invoegen in Oracle-database:wat is beter:VOOR Cursorlus of een eenvoudige Select?