PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Pilih catatan pertama jika tidak ada yang cocok

Anda berada di jalur yang benar. Cukup tambahkan 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;

Atau, secara bergantian:

ORDER BY ord DESC

Salah satu dari ini akan menempatkan ord = 0 baris terakhir.

EDIT:

Erwin mengemukakan poin bagus bahwa dari perspektif penggunaan indeks, sebuah OR di WHERE klausa bukanlah pendekatan terbaik. Saya akan mengubah jawaban saya menjadi:

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;

Ini memungkinkan kueri menggunakan dua indeks (street dan ord ). Perhatikan bahwa ini benar-benar hanya karena LIKE pola tidak dimulai dengan wildcard. Jika LIKE pola dimulai dengan karakter pengganti, maka bentuk kueri ini akan tetap melakukan pemindaian tabel penuh.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL Terbalik SEPERTI

  2. SEPERTI permintaan pada elemen array jsonb datar

  3. Batasan unik Postgres vs indeks

  4. SQLAlchemy beberapa kunci asing dalam satu kelas yang dipetakan ke kunci utama yang sama

  5. Pemeriksaan tercepat apakah baris ada di PostgreSQL