sql >> Database teknologi >  >> RDS >> PostgreSQL

Vælg første post, hvis ingen matcher

Du er på rette vej. Du skal blot tilføje 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

Hver af disse vil sætte ord = 0 række sidst.

EDIT:

Erwin kommer med en god pointe, at fra indeksbrugsperspektivet er en OR i WHERE klausul er ikke den bedste tilgang. Jeg vil ændre mit svar til at være:

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;

Dette gør det muligt for forespørgslen at gøre brug af to indekser (street og ord ). Bemærk, at dette egentlig kun er fordi LIKE mønsteret starter ikke med et jokertegn. Hvis LIKE mønsteret starter med et jokertegn, så ville denne form for forespørgslen stadig udføre en fuld tabelscanning.



  1. opdele streng i flere rækker

  2. Bucketizing data og klokkeslæt

  3. Kom godt i gang med Cloud Firestore til iOS

  4. ListView-kontrol med Ms-Access TreeView