1

JSONB_ARRAY_ELEMENTS呼び出しの結果をVARCHAR 配列に割り当てようとすると(後でSELECT ... WHERE IN (UNNEST(...))ステートメントで使用するため)、次のストアド関数:

CREATE OR REPLACE FUNCTION test1(
        IN in_sids jsonb,
        OUT out_uid integer)
        RETURNS integer AS
$func$
DECLARE
        sids varchar[];
        uids integer[];
BEGIN
        sids := (SELECT x->>'sid' FROM JSONB_ARRAY_ELEMENTS(in_sids) x);
        -- uids := (SELECT uid FROM social WHERE sid IN (UNNEST(sids)));

        RAISE NOTICE 'sids = %', sids;
        RAISE NOTICE 'uids = %', uids;

        SELECT 1;
END
$func$ LANGUAGE plpgsql;

残念ながら、エラーが出力されます:

# select test1('[{"sid":"aaa"},{"sid":"bbb"}]'::jsonb);

ERROR:  more than one row returned by a subquery used as an expression
CONTEXT:  SQL statement "SELECT (SELECT x->>'sid' FROM JSONB_ARRAY_ELEMENTS(in_sids) x)"
PL/pgSQL function test1(jsonb) line 6 at assignment

だから私はARRAY_AGGを使用して割り当てを修正しようとしました-

sids := SELECT ARRAY_AGG(SELECT x->>'sid' FROM JSONB_ARRAY_ELEMENTS(in_sids) x);

しかし、構文エラーが発生します:

ERROR:  syntax error at or near "SELECT"
LINE 10:         sids := SELECT ARRAY_AGG(SELECT x->>'sid' FROM JSONB...
                         ^

JSONB_ARRAY_ELEMENTS結果を配列に保存する方法を教えてください。

アップデート:

私は Nick のアドバイスに従いました (ありがとう)。

CREATE OR REPLACE FUNCTION test1(
        IN in_sids jsonb,
        OUT out_uid integer)
        RETURNS integer AS
$func$
DECLARE
        sids varchar[];
        uids integer[];
BEGIN
        sids := (SELECT ARRAY_AGG(x->>'sid') FROM JSONB_ARRAY_ELEMENTS(in_sids) x);
        uids := (SELECT uid FROM social WHERE sid IN (UNNEST(sids)));

        SELECT 1;
END
$func$ LANGUAGE plpgsql;

SELECT ... WHERE IN ...ステートメントで配列を使用しようとすると:

# select test1('[{"sid":"aaa"},{"sid":"bbb"}]'::jsonb);
ERROR:  argument of IN must not return a set
LINE 1: SELECT (SELECT uid FROM social WHERE sid IN (UNNEST(si...
                                              ^
QUERY:  SELECT (SELECT uid FROM social WHERE sid IN (UNNEST(sids)))
CONTEXT:  PL/pgSQL function test1(jsonb) line 7 at assignment
4

1 に答える 1