PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak przełączać się między operacją indeksowaną i nieindeksowaną w zależności od danych wejściowych?

Nie sądzę, że można to zrobić w czystym SQL.

Przetłumaczenie tego na PL/pgSQL jest całkiem proste.

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$

Sprawdziłem, że używa indeksu geograficznego <75 i btree (reply_count, convo_id) indeks na poziomie 75 i wyższym.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. django.db.migrations.RenameModel i nazwa sekwencji AutoField

  2. PostgreSQL bez instalacji działa w systemie Windows, ale serwer nie uruchamia się w CentOS Linux

  3. ZAMÓWIENIE PRZEZ Alias ​​nie działa

  4. Analiza porównawcza zarządzanych rozwiązań chmurowych PostgreSQL — część pierwsza:Amazon Aurora

  5. Nie można uruchomić Postgres.app na porcie 5432