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

PostgreSQL parametrizované Order By / Limit v tabulkové funkci

Na funkci plpgsql není nic špatného pro něco trochu složitějšího. Jedinou situací, kdy může dojít ke zhoršení výkonu, je situace, kdy je vnořena funkce plpgsql, protože plánovač dotazů nemůže dále optimalizovat obsažený kód v kontextu vnějšího dotazu, což jej může nebo nemusí zpomalit.
Další podrobnosti později odpověď:

  • Rozdíl mezi jazykem sql a jazykem plpgsql ve funkcích PostgreSQL

V tomto případě je to mnohem jednodušší než spousta CASE klauzule v dotazu:

CREATE OR REPLACE FUNCTION get_stuff(_param text, _orderby text, _limit int)
  RETURNS SETOF stuff AS
$func$
BEGIN
   RETURN QUERY EXECUTE '
      SELECT *
      FROM   stuff
      WHERE  col = $1
      ORDER  BY ' || quote_ident(_orderby) || ' ASC
      LIMIT  $2'
   USING _param, _limit;
END
$func$  LANGUAGE plpgsql;

Volejte:

SELECT * FROM get_stuff('hello', 'col2', 100);

Poznámky

Použijte RETURN QUERY EXECUTE vrátit výsledky dotazu najednou.

Použijte quote_ident() pro identifikátory na ochranu před SQLi.
Nebo format() na cokoliv složitějšího. Viz:

  • Název tabulky jako parametr funkce PostgreSQL

Předejte hodnoty parametrů pomocí USING klauzule, aby se zabránilo přetypování, citacím a SQLi ještě jednou.

Dejte pozor, abyste nevytvářeli konflikty názvů mezi parametry a názvy sloupců. Před názvy parametrů jsem přidal podtržítko (_ ) v příkladu. Jen moje osobní preference.

Vaše druhá funkce po úpravě nemůže fungovat, protože vracíte pouze parent zatímco návratový typ je deklarován SETOF stuff . Můžete deklarovat jakékoli návratový typ se vám líbí, ale skutečné návratové hodnoty musí odpovídat deklaraci. Možná budete chtít použít RETURNS TABLE za to.



  1. Přepnutí/přepnutí v Slony-I při upgradu PostgreSQL hlavních verzí 8.4.x/9.3.x

  2. Pochopení znakových sad a řazení v MySQL

  3. Přebudování MySQL 8.0 Replication Slave pomocí klonovacího pluginu

  4. Jak GROUP BY funguje?