Можете да постигнете това с проста SQL функция. Ключова характеристика е функцията generate_subscripts()
:
CREATE OR REPLACE FUNCTION f_attendance(_arr2d int[])
RETURNS SETOF attendance AS
$func$
SELECT a.*
FROM generate_subscripts($1, 1) i
JOIN attendance a ON a.class = $1[i][1]
AND a.section = $1[i][2]
$func$ LANGUAGE ROWS 10 sql STABLE;
Обадете се:
SELECT * FROM f_attendance(ARRAY[[1,1],[2,2]]);
Или същото с масив literal - което е по-удобно в някои контексти, особено с подготвени изявления:
SELECT * FROM f_attendance('{{1,1},{2,2}}');
Функцията винаги очаква 2D масив. Дори и да преминете един чифт, вложете го:
SELECT * FROM f_attendance('{{1,1}}');
Одит на внедряването ви
-
Направихте функцията
VOLATILE
, но може да бъдеSTABLE
. По документация:Поради това поведение на моментна снимка, функция, съдържаща само
SELECT
командите могат безопасно да бъдат маркираниSTABLE
.Свързано:
- Как да предам параметър във функция за дата
-
Вие също използвате
LANGUAGE plpgsql
вместоsql
, което има смисъл, ако изпълнявате функцията няколко пъти в една и съща сесия. Но тогава трябва също да го направитеSTABLE
или губите тази потенциална полза от производителността. Още веднъж ръководството:STABLE
иIMMUTABLE
функциите използват моментна снимка, установена към началото на извикващата заявка, докато функциите VOLATILE получават прясна снимка в началото на всяка заявка, която изпълняват. -
Вашето
EXPLAIN
изходът показва Сканиране само с индекс , а не последователно сканиране, както подозирате в коментара си. -
Във вашия
EXPLAIN
има и стъпка за сортиране изход, който не съвпада с кода, който показвате. Сигурни ли сте, че сте копирали правилнияEXPLAIN
изход? Как изобщо го получи? Функциите на PL/pgSQL са черни кутии заEXPLAIN
. Използвахте лиauto_explain
? Подробности:- План на заявка Postgres на извикване на UDF, написано в pgpsql
-
Инструментът за планиране на заявки в Postgres няма представа колко елемента на масива ще има предаденият параметър, така че е трудно да се планира заявката и може по подразбиране да се извършва последователно сканиране (в зависимост от повече фактори). Можете да помогнете, като декларирате очаквания брой редове. Ако обикновено нямате повече от 10 елемента, добавете
ROWS 10
както направих сега по-горе. И тествайте отново.