PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wybierz pierwszy rekord, jeśli żaden nie pasuje

Jesteś na dobrej drodze. Po prostu dodaj 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;

Lub alternatywnie:

ORDER BY ord DESC

Każdy z nich umieści ord = 0 ostatni wiersz.

EDYCJA:

Erwin zwraca uwagę, że z perspektywy wykorzystania indeksu OR w WHERE klauzula nie jest najlepszym podejściem. Zmodyfikowałbym moją odpowiedź tak, aby była:

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;

Pozwala to na użycie dwóch indeksów (street i ord ). Zauważ, że dzieje się tak naprawdę tylko dlatego, że LIKE wzór nie zaczyna się od symbolu wieloznacznego. Jeśli LIKE wzorzec zaczyna się od symbolu wieloznacznego, wtedy ta forma zapytania nadal wykonałaby pełne skanowanie tabeli.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sekwencje, na które nie mają wpływu transakcje?

  2. Jak Sinh() działa w PostgreSQL

  3. Jak przywrócić plik zrzutu PostgreSQL do baz danych Postgres?

  4. jak stworzyć tabelę dat gregoriańskich ISO-8601 w postgresie

  5. BŁĄD:odmowa uprawnień dla relacji nazwa tabeli w Postgresie podczas próby SELECT jako użytkownik tylko do odczytu