sql >> Base de Datos >  >> RDS >> PostgreSQL

Seleccione el primer registro si ninguno coincide

Estás en el camino correcto. Simplemente agregue 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;

O, alternativamente:

ORDER BY ord DESC

Cualquiera de estos pondrá el ord = 0 última fila.

EDITAR:

Erwin menciona un buen punto que, desde la perspectiva del uso del índice, un OR en el WHERE cláusula no es el mejor enfoque. Modificaría mi respuesta para que sea:

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;

Esto permite que la consulta utilice dos índices (street y ord ). Tenga en cuenta que esto es realmente solo porque LIKE patrón no comienza con un comodín. Si el LIKE el patrón comienza con un comodín, entonces esta forma de consulta aún haría un escaneo completo de la tabla.