sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur återanvänder man resultatet för SELECT-, WHERE- och ORDER BY-klausuler?

I GROUP BY och ORDER BY sats du kan referera till kolumnalias (utdatakolumner) eller till och med ordningsnummer för SELECT listobjekt. Jag citerar manualen på ORDER BY :

Varje uttryck kan vara namnet eller ordningsnumret för en utdatakolumn (VÄLJ listobjekt) , eller så kan det vara ett godtyckligt uttryck bildat av indata-kolumnvärden.

Djärv betoning min.

Men i WHERE och HAVING satser, kan du bara hänvisa till kolumner från bastabellerna (indatakolumner), så du måste stava ditt funktionsanrop.

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;

Om du vill veta om det går snabbare att packa beräkningen i en CTE eller underfråga, testa det bara med EXPLAIN ANALYZE . (Jag tvivlar 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;

Som @Mike kommenterade, genom att deklarera en funktion STABLE (eller IMMUTABLE ) informerar du frågeplaneraren att resultat från ett funktionsanrop kan återanvändas flera gånger för identiska anrop inom ett enda uttalande. Jag citerar manualen här:

En STABLE-funktion kan inte modifiera databasen och är garanterad att returnera samma resultat med samma argument för alla rader inom en enskild sats. Den här kategorin låter optimeraren optimera flera anrop av funktionen till ett enda anrop .

Djärv betoning min.



  1. MySQL:ÄNDRA TABELL om kolumnen inte finns

  2. Hur man använder kommandot Compact and Repair i Access

  3. Hur kan jag ändra min standarddatabas i SQL Server utan att använda MS SQL Server Management Studio?

  4. PostgreSQL - Byt namn på databas