Một tùy chọn sẽ là một cái gì đó dọc theo dòng:
select the_value,
abs(the_value - 14) as distance_from_test
from the_table
order by distance_from_test
limit 1
Để chọn một bản ghi ngẫu nhiên, bạn có thể thêm , rand()
đến order by
mệnh đề. Nhược điểm của phương pháp này là bạn không nhận được bất kỳ lợi ích nào từ các chỉ số vì bạn phải sắp xếp trên giá trị bắt nguồn distance_from_test
.
Nếu bạn có chỉ mục trên the_value
và bạn nới lỏng yêu cầu của mình để kết quả là ngẫu nhiên trong trường hợp ràng buộc, bạn có thể thực hiện một cặp truy vấn trong phạm vi giới hạn để chọn giá trị đầu tiên ngay trên giá trị thử nghiệm và giá trị đầu tiên ngay bên dưới giá trị thử nghiệm và chọn giá trị nào gần nhất đến giá trị thử nghiệm:
(
select the_value
from the_table
where the_value >= 14
order by the_value asc
limit 1
)
union
(
select the_value
from the_table
where the_value < 14
order by the_value desc
limit 1
)
order by abs(the_value - 14)
limit 1