Ett alternativ skulle vara något i stil med:
select the_value,
abs(the_value - 14) as distance_from_test
from the_table
order by distance_from_test
limit 1
För att välja en slumpmässig post kan du lägga till , rand()
till order by
klausul. Nackdelen med denna metod är att du inte får någon nytta av index eftersom du måste sortera på det härledda värdet distance_from_test
.
Om du har ett index på the_value
och du lättar på ditt krav på att resultatet ska vara slumpmässigt vid oavgjort, kan du utföra ett par frågor med begränsat intervall för att välja det första värdet omedelbart ovanför testvärdet och det första värdet omedelbart under testvärdet och välja det som är närmast till testvärdet:
(
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