PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wählen Sie den ersten Datensatz aus, wenn keiner übereinstimmt

Du bist auf dem richtigen Weg. Fügen Sie einfach ein order by hinzu :

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;

Oder alternativ:

ORDER BY ord DESC

Beide setzen ord = 0 letzte Zeile.

BEARBEITEN:

Erwin spricht einen guten Punkt an, der aus Sicht der Indexnutzung ein OR ist im WHERE Klausel ist nicht der beste Ansatz. Ich würde meine Antwort wie folgt ändern:

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;

Dadurch kann die Abfrage zwei Indizes verwenden (street und ord ). Beachten Sie, dass dies wirklich nur am LIKE liegt Muster beginnt nicht mit einem Platzhalter. Wenn der LIKE Muster mit einem Platzhalter beginnt, würde diese Form der Abfrage dennoch einen vollständigen Tabellenscan durchführen.