sql >> Databasteknik >  >> RDS >> PostgreSQL

Välj första posten om ingen matchar

Du är på rätt väg. Lägg bara till en 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;

Eller alternativt:

ORDER BY ord DESC

Båda dessa sätter ord = 0 rad sist.

EDIT:

Erwin tar upp en bra poäng att ur indexanvändningens perspektiv är en OR i WHERE klausul är inte det bästa tillvägagångssättet. Jag skulle ändra mitt svar till att vara:

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;

Detta gör att frågan kan använda två index (street och ord ). Observera att detta egentligen bara beror på att LIKE mönstret börjar inte med ett jokertecken. Om LIKE mönstret börjar med ett jokertecken, sedan skulle den här formen av frågan fortfarande göra en fullständig tabellskanning.



  1. Infoga flera rader med en MySQL-fråga

  2. Hur löser man tvetydiga kolumnnamn när man hämtar resultat?

  3. Hur använder man PBKDF2 i Oracle 12c?

  4. Hur man ansluter till databasen med NaviCat MySQL-klient