Я пытаюсь запустить функцию plpgsql в многомерном столбце массива (int[][]
) в выбранном запросе.Функция plpgsql, принимающая многомерный массив как параметр
Функция как таковой:
CREATE OR REPLACE FUNCTION public.reduce_to_percentages(int[][])
RETURNS float[] AS
$function$
DECLARE
s int[];
a float[];
BEGIN
FOREACH s SLICE 1 IN ARRAY $1 LOOP
a := a || s[2]::float/s[1]::float;
END LOOP;
RETURN a;
END;
$function$
LANGUAGE plpgsql VOLATILE;
Следующий запрос работает:
SELECT reduce_to_percentages(ARRAY[ARRAY[100, 20], ARRAY[300, 50]]);
Так делает следующий запрос:
SELECT reduce_to_percentages((SELECT counts FROM objects LIMIT 1));
Но следующий запрос предоставляет функцию с значение null
и вызывает исключение при попытке.над $1
:
SELECT reduce_to_percentages(counts) FROM objects;
Ничего себе, очень подробное объяснение, большое спасибо !!! Что касается 'int [] []' игнорируется, я знал это, но для своей собственной способности чтения я написал функцию, чтобы она была более явной в типе принимаемого значения. Две вещи, которые я до сих пор не понимаю: 1) в чем разница между неизменяемыми и неустойчивыми функциями, что делает эту функцию неизменной? 2) почему ответ @ klin решил мою проблему? Он добавил только случай для нулевых значений, который возвращает пустой список, но с помощью его функции мой запрос работал (для ненулевых значений). –
@YotamOfek: Ad 1.) [Я добавил ссылку на большее объяснение] (http://stackoverflow.com/questions/28569415/how-do-immutable-stable-and-volatile-keywords-effect-behaviour-of- функция/28573737 # 28573737). Объявление 2.) Ошибка, которую вы видели, была поднята конструкцией 'FOREACH', которая не работает для ввода NULL. –
* Положите помаду на свиньи * - у вас есть особое чувство юмора, но мне оно нравится. Вы знаете, что ваше решение быстрее или просто догадывается? – klin