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

Jak ponownie wykorzystać wynik dla klauzul SELECT, WHERE i ORDER BY?

W GROUP BY i ORDER BY klauzula, do której możesz się odwoływać aliasy kolumn (kolumny wyjściowe) lub nawet liczby porządkowe SELECT Lista przedmiotów. Cytuję instrukcję na ORDER BY :

Każde wyrażenie może być nazwą lub numerem porządkowym kolumny wyjściowej (element listy SELECT) , lub może to być dowolne wyrażenie utworzone z wartości w kolumnie wejściowej.

Pogrubiony nacisk na moje.

Ale w WHERE i HAVING klauzul, możesz odwoływać się tylko do kolumn z tabel bazowych (kolumn wejściowych), więc musisz przeliterować wywołanie funkcji.

SELECT *, earth_distance(ll_to_earth(62.0, 25.0), ll_to_earth(lat, lon)) AS dist
FROM   venues 
WHERE  earth_distance(ll_to_earth(62.0, 25.0), ll_to_earth(lat, lon)) <= radius 
ORDER  BY distance;

Jeśli chcesz wiedzieć, czy szybciej spakować obliczenia do CTE lub podzapytania, po prostu przetestuj je za pomocą EXPLAIN ANALYZE . (Wątpię.)

SELECT *
FROM  (
   SELECT *
         ,earth_distance(ll_to_earth(62.0, 25.0), ll_to_earth(lat, lon)) AS dist
   FROM   venues
   ) x
WHERE  distance <= radius 
ORDER  BY distance;

Jak skomentował @Mike, deklarując funkcję STABLE (lub IMMUTABLE ) informujesz planistę zapytań, że wyniki wywołania funkcji mogą być wielokrotnie użyte w przypadku identycznych wywołań w ramach jednej instrukcji. Cytuję instrukcję tutaj:

Funkcja STABILNA nie może modyfikować bazy danych i gwarantuje, że zwróci te same wyniki przy tych samych argumentach dla wszystkich wierszy w ramach jednej instrukcji. Ta kategoria pozwala optymalizatorowi na optymalizację wielu wywołań funkcji do jednego wywołania .

Pogrubiony nacisk na moje.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak pisać wielką literą każdego słowa w PostgreSQL

  2. Kolumna tabeli automatycznego przyrostu

  3. Poprawka:„operator nie istnieje:liczba całkowita || liczba całkowita” w PostgreSQL

  4. Pracownicy Rails Resque zawodzą z PGError:serwer nieoczekiwanie zamknął połączenie

  5. Problemy z poleceniem postgresql COPY z Railsami na innym serwerze