PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann je nach Eingabe zwischen einer indizierten und einer nicht indizierten Operation umgeschaltet werden?

Ich glaube nicht, dass dies in reinem SQL möglich ist.

Es ist ziemlich einfach, dies in PL/pgSQL zu übersetzen.

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$

Ich habe überprüft, dass es den geografischen Index <75 und den btree (reply_count, convo_id) verwendet Index bei 75 und darüber.