Eine Option wäre so etwas wie:
select the_value,
abs(the_value - 14) as distance_from_test
from the_table
order by distance_from_test
limit 1
Um einen zufälligen Datensatz auszuwählen, können Sie , rand()
hinzufügen zum order by
Klausel. Der Nachteil dieser Methode ist, dass Sie keinen Nutzen aus Indizes ziehen, da Sie nach dem abgeleiteten Wert distance_from_test
sortieren müssen .
Wenn Sie einen Index auf the_value
haben und Sie lockern Ihre Anforderung, dass das Ergebnis im Fall von Unentschieden zufällig sein muss, können Sie ein Paar Abfragen mit begrenztem Bereich durchführen, um den ersten Wert direkt über dem Testwert und den ersten Wert direkt unter dem Testwert auszuwählen und den nächstliegenden auszuwählen zum Testwert:
(
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