PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Chọn bản ghi đầu tiên nếu không có bản ghi nào phù hợp

Bạn đang đi đúng hướng. Chỉ cần thêm một 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;

Hoặc, cách khác:

ORDER BY ord DESC

Một trong hai cách này sẽ đặt ord = 0 hàng cuối cùng.

CHỈNH SỬA:

Erwin đưa ra một điểm tốt rằng từ quan điểm sử dụng chỉ mục, một OR trong WHERE mệnh đề không phải là cách tiếp cận tốt nhất. Tôi sẽ sửa đổi câu trả lời của mình thành:

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;

Điều này cho phép truy vấn sử dụng hai chỉ mục (streetord ). Lưu ý rằng điều này thực sự chỉ vì LIKE mẫu không bắt đầu bằng ký tự đại diện. Nếu LIKE mẫu bắt đầu bằng ký tự đại diện, sau đó biểu mẫu này của truy vấn sẽ vẫn quét toàn bộ bảng.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để gỡ lỗi các thủ tục được lưu trữ postgresql?

  2. Django số lượng lớn_create với các hàng bỏ qua gây ra lỗi IntegrityError?

  3. Không thể kết nối với Postgres qua PHP nhưng có thể kết nối từ dòng lệnh và PgAdmin trên máy khác

  4. Số lượng phân trang Django Rest Framework cực kỳ chậm

  5. Rails:Cài đặt PG gem trên OS X - không tạo được phần mở rộng gốc