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

Seleziona il primo record se nessuno corrisponde

Sei sulla strada giusta. Basta aggiungere 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;

Oppure, in alternativa:

ORDER BY ord DESC

Ognuno di questi metterà ord = 0 ultima riga.

MODIFICA:

Erwin solleva un buon punto che dal punto di vista dell'utilizzo dell'indice, un OR nel WHERE la clausola non è l'approccio migliore. Modificherei la mia risposta 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;

Ciò consente alla query di utilizzare due indici (street e ord ). Nota che questo è davvero solo perché il LIKE il modello non inizia con un carattere jolly. Se il LIKE pattern inizia con un carattere jolly, quindi questa forma della query eseguirà comunque una scansione completa della tabella.