PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да използвам повторно резултат за клаузите SELECT, WHERE и ORDER BY?

В GROUP BY и ORDER BY клауза можете да се позовавате на псевдоними на колони (изходни колони) или дори поредни номера на SELECT списък с елементи. Цитирам ръководството на ORDER BY :

Всеки израз може да бъде име или пореден номер на изходна колона (SELECT елемент от списъка) , или може да бъде произволен израз, образуван от стойности на входната колона.

Удебелен акцент мое.

Но в WHERE и HAVING клаузи, можете да се позовавате само на колони от базовите таблици (входни колони), така че трябва да напишете извикването на функцията си.

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;

Ако искате да знаете дали е по-бързо да опаковате изчислението в CTE или подзаявка, просто го тествайте с EXPLAIN ANALYZE . (Съмнявам се.)

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;

Като коментира @Mike, като декларира функция STABLE (или IMMUTABLE ) информирате планировщика на заявки, че резултатите от извикване на функция могат да бъдат използвани многократно за идентични повиквания в рамките на един израз. Цитирам ръководството тук:

Функция STABLE не може да модифицира базата данни и е гарантирана, че ще върне същите резултати при едни и същи аргументи за всички редове в рамките на един израз. Тази категория позволява на оптимизатора да оптимизира множество извиквания на функцията към едно извикване .

Удебелен акцент мое.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какъв е правилният индекс за запитване на структури в масиви в Postgres jsonb?

  2. Как работи LocalTimeStamp() в PostgreSQL

  3. Рекурсивна заявка на Postgres с row_to_json

  4. QPSQL драйверът не е зареден Qt

  5. Използване на кеширане на pg_prewarm и pg_hibernator на contrib в PostgreSQL 9.4.