このループ内でRETURN QUERY
を使用して、RAISE NOTICE
ではなくUserResponseList
からのすべての値を表示できますか?
FOR i IN 1 .. array_upper(UserResponseList, 1)
LOOP
RAISE NOTICE '%, %, %', QuestionList[i], UserResponseID_List[i], UserResponseList[i];
END LOOP;
このループ内でreturnクエリを使用できますか?
あなたできます使用 _RETURN QUERY
_ :
_CREATE OR REPLACE FUNCTION f_pivot_arrays()
RETURNS TABLE(question text, response_id int, response text) AS
$func$
DECLARE
QuestionList text[] := '{Who?,When?,WHY?}';
UserResponseID_List int[] := '{1,2,3}';
UserResponseList text[] := '{Here.,Now.,Because.}';
BEGIN
FOR i IN 1 .. array_upper(UserResponseList, 1)
LOOP
RETURN QUERY SELECT QuestionList[i], UserResponseID_List[i], UserResponseList[i];
END LOOP;
END
$func$ LANGUAGE plpgsql STABLE;
_
または _RETURN NEXT
_ :
_...
FOR i IN 1 .. array_upper(UserResponseList, 1)
LOOP
SELECT QuestionList[i], UserResponseID_List[i], UserResponseList[i]
INTO question, response_id, response;
RETURN NEXT;
END LOOP;
...
_
しかし、Postgres 9.4以降、配列を並列にネスト解除するためのより簡単なツールはunnest()
です:
_ RETURN QUERY
SELECT *
FROM unnest(QuestionList, UserResponseID_List, UserResponseList);
_
dbfiddle ここ
関連:
あなたはのようなものを探していますか
select
UserResponseList.UserResponseList , UserResponseID_List.value ,QuestionList.value
from
generate_series(1, array_upper(ARRAY[1,8,3,7,22,31], 1) ,1) UserResponseList
left join
(
select generate_subscripts(a.arr,1) as subscript, a.arr[generate_subscripts(a.arr,1)] as value
from (select ARRAY[25,8,3,7,29] as arr) a
)
UserResponseID_List on UserResponseList .UserResponseList = UserResponseID_List .subscript
left join
(
select generate_subscripts(a.arr,1) as subscript, a.arr[generate_subscripts(a.arr,1)] as value
from (select ARRAY[1,3,16] as arr) a
)
QuestionList on UserResponseList .UserResponseList = QuestionList .subscript
はい、できます 並列配列unnest
です。
SELECT row_number() OVER (), *
FROM table
CROSS JOIN LATERAL unnest( QuestionList, UserResponseID_List, UserResponseList );
これがRAISE NOTICE
とどう関係しているのかはわかりませんが、そこから理解できると思います。