sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan genbruger man resultatet til SELECT-, WHERE- og ORDER BY-klausuler?

I GROUP BY og ORDER BY klausul, du kan henvise til kolonnealiaser (outputkolonner) eller endda ordenstal for SELECT listeelementer. Jeg citerer manualen på ORDER BY :

Hvert udtryk kan være navnet eller ordensnummeret på en outputkolonne (VÆLG listeelement) , eller det kan være et vilkårligt udtryk dannet ud fra input-kolonneværdier.

Fed fremhævelse mine.

Men i WHERE og HAVING klausuler, kan du kun henvise til kolonner fra basistabellerne (input kolonner), så du skal stave dit funktionskald.

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;

Hvis du vil vide, om det er hurtigere at pakke beregningen ind i en CTE eller underforespørgsel, skal du bare teste den med EXPLAIN ANALYZE . (Jeg tvivler på det.)

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;

Ligesom @Mike kommenterede, ved at erklære en funktion STABLE (eller IMMUTABLE ) informerer du forespørgselsplanlæggeren om, at resultater fra et funktionskald kan genbruges flere gange til identiske opkald inden for en enkelt erklæring. Jeg citerer manualen her:

En STABLE funktion kan ikke ændre databasen og er garanteret at returnere de samme resultater givet de samme argumenter for alle rækker i en enkelt sætning. Denne kategori giver optimeringsværktøjet mulighed for at optimere flere opkald af funktionen til et enkelt opkald .

Fed fremhævelse mine.



  1. Hvordan dropper man flere intervalpartitioner baseret på dato?

  2. Sådan ændres samlingen af ​​en SQL Server-database ved hjælp af T-SQL

  3. ScaleGrid PostgreSQL på VMware Cloud Infrastructure

  4. Find ødelagte objekter i SQL Server