web-dev-qa-db-ja.com

PL / pgSQLでの値の配列によるループ

このループ内で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;
1
M.Karthika

このループ内で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 ここ

関連:

3

あなたはのようなものを探していますか

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
0
a1ex07

はい、できます 並列配列unnest です。

SELECT row_number() OVER (), *
FROM table
CROSS JOIN LATERAL unnest( QuestionList, UserResponseID_List, UserResponseList );

これがRAISE NOTICEとどう関係しているのかはわかりませんが、そこから理解できると思います。

0
Evan Carroll