sql >> Databáze >  >> RDS >> PostgreSQL

Jak znovu použít výsledek pro klauzule SELECT, WHERE a ORDER BY?

V GROUP BY a ORDER BY klauzule můžete odkazovat na aliasy sloupců (výstupní sloupce) nebo dokonce na pořadová čísla SELECT seznam položek. Cituji manuál na ORDER BY :

Každý výraz může být název nebo pořadové číslo výstupního sloupce (položka seznamu SELECT) , nebo to může být libovolný výraz vytvořený z hodnot vstupního sloupce.

Tučné zdůraznění moje.

Ale v WHERE a HAVING klauzule, můžete odkazovat pouze na sloupce ze základních tabulek (vstupní sloupce), takže musíte upřesnit volání funkce.

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;

Pokud chcete vědět, zda je rychlejší zabalit výpočet do CTE nebo poddotazu, otestujte jej pomocí EXPLAIN ANALYZE . (O tom pochybuji.)

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 poznamenal @Mike, deklarováním funkce STABLE (nebo IMMUTABLE ) informujete plánovač dotazů, že výsledky volání funkce lze opakovaně použít pro identická volání v rámci jednoho příkazu. Zde cituji manuál:

Funkce STABLE nemůže modifikovat databázi a je zaručeno, že vrátí stejné výsledky se stejnými argumenty pro všechny řádky v jediném příkazu. Tato kategorie umožňuje optimalizátoru optimalizovat více volání funkce na jediné volání .

Tučné zdůraznění moje.



  1. mysqli_fetch_array() očekává, že parametr 1 bude mysqli_result, booleovský zadaný v

  2. Uložte více bitových hodnot do jednoho sloupce tabulky

  3. Jak spustit příkaz MySQL ze skriptu shellu?

  4. Co je to vlastní runtime obrázek v Javě 9?