मुझे नहीं लगता कि इसे शुद्ध SQL में किया जा सकता है।
इसे PL/pgSQL में अनुवाद करना बहुत आसान है।
CREATE OR REPLACE FUNCTION public.usp_get_data(i_distance_choice integer, i_longitude double precision, i_latitude double precision)
RETURNS TABLE(convo_id bigint)
LANGUAGE plpgsql
STABLE
AS $function$
BEGIN
IF i_distance_choice < 75 then
return query SELECT po.convo_id
FROM post po
WHERE ST_DWithin(po.geog, ST_SetSRID(ST_MakePoint(i_longitude, i_latitude), 4326), i_distance_choice * 1609.34)
ORDER BY po.reply_count DESC, convo_id DESC
LIMIT 10;
ELSE
return query SELECT po.convo_id
FROM post po
WHERE po.geog<->ST_SetSRID(ST_MakePoint(i_longitude, i_latitude), 4326) < i_distance_choice * 1609.34
ORDER BY po.reply_count DESC, convo_id DESC
LIMIT 10;
END IF;
END
$function$
मैंने सत्यापित किया है कि यह भूगोल सूचकांक <75 और btree (reply_count, convo_id)
का उपयोग करता है सूचकांक 75 और उससे अधिक पर।