2012-04-09 37 views
11

Tôi cần truy vấn SQLite để tìm kiếm 1 trường chỉ sử dụng LIKE.GIỐNG NHƯ & ĐẶT HÀNG theo yêu cầu kết hợp

dụ cơ bản:

SELECT name FROM table WHERE name LIKE "%John%" ORDER BY name LIMIT 10; 

Vấn đề là tôi muốn kết quả được sắp xếp theo cách này:

  1. Nếu trường là bằng nhau (ví dụ: "John")
  2. Nếu trường bắt đầu bằng "John" (ví dụ: "John Doe")
  3. Nếu trường có chứa "John" (ví dụ: "Jane John Doe")

Các truy vấn sau đây đạt được kết quả mong đợi, nhưng là chậm:

SELECT name FROM table WHERE name LIKE "%John%" ORDER BY CASE WHEN name = "John" 
THEN 1 ELSE 2 END, CASE WHEN name LIKE "John%" THEN 1 ELSE 2 END, name LIMIT 10; 

Truy vấn trên là chậm (hoặc tôi thử nghiệm nó không chính xác) hơn thay thế của việc sử dụng 3 truy vấn riêng biệt (một trận đấu chính xác, một cho bắt đầu và một cho chứa).

Có lựa chọn thay thế nào khác không?

Trả lời

14

Hãy thử theo cách này:

SELECT name 
FROM table 
WHERE name LIKE "%John%" 
ORDER BY (CASE WHEN name = "John" THEN 1 WHEN name LIKE "John%" THEN 2 ELSE 3 END),name LIMIT 10 ; 
6

Nó nên là đủ để đặt hàng trên các bài kiểm tra tính tương đương của bạn:

ORDER BY name = "John" DESC, name LIKE "John%" DESC 

ORDER BY khoản được đánh giá từ trái sang phải.

Các vấn đề liên quan