如何将函数应用于 json 数组的每个元素?
How to apply a function to each element of a json array?
给出这个函数:
CREATE OR REPLACE FUNCTION extract_key(
i_m JSONB,
i_key TEXT
) RETURNS JSONB AS $$
BEGIN
RETURN i_m -> i_key;
END;
$$ LANGUAGE 'plpgsql';
我想编写一个函数 extract_key_array
其中:
SELECT extract_key_array('hello', '[{"hello": {"id": 1}} ,{"hello": {"id": 2}}]')
输出一个json数组:'[{"id": 1},{"id": 2}]'
这可行,但也许有更快的方法。
CREATE OR REPLACE FUNCTION extract_key_array(
i_arr JSONB,
i_key TEXT
) RETURNS JSONB AS $$
BEGIN
RETURN jsonb_agg(extract_key(out,i_key)) FROM jsonb_array_elements(i_arr) AS out;
END;
$$ LANGUAGE 'plpgsql';
你的回答基本不错。一些改进:
CREATE OR REPLACE FUNCTION extract_key_array(_key text, _arr jsonb)
RETURNS jsonb
LANGUAGE sql STABLE PARALLEL SAFE AS
$func$
SELECT jsonb_agg(elem -> _key) FROM jsonb_array_elements(_arr) elem;
$func$;
适用于您想要的函数调用:
SELECT extract_key_array('hello', '[{"hello": {"id": 1}} ,{"hello": {"id": 2}}]')
db<>fiddle here
一个简单的 SQL 函数就可以完成这项工作,并且可以 内联 。
声明函数STABLE
和PARALLEL SAFE
(因为它是!)这允许在查询计划中进行各种优化。
(不要声明它 IMMUTABLE
因为包含的 jsonb_agg()
只是 STABLE
出于某些未知原因。)
你的回答调换了问题中函数参数的显示顺序
关于函数内联:
- Function executes faster without STRICT modifier?
给出这个函数:
CREATE OR REPLACE FUNCTION extract_key(
i_m JSONB,
i_key TEXT
) RETURNS JSONB AS $$
BEGIN
RETURN i_m -> i_key;
END;
$$ LANGUAGE 'plpgsql';
我想编写一个函数 extract_key_array
其中:
SELECT extract_key_array('hello', '[{"hello": {"id": 1}} ,{"hello": {"id": 2}}]')
输出一个json数组:'[{"id": 1},{"id": 2}]'
这可行,但也许有更快的方法。
CREATE OR REPLACE FUNCTION extract_key_array(
i_arr JSONB,
i_key TEXT
) RETURNS JSONB AS $$
BEGIN
RETURN jsonb_agg(extract_key(out,i_key)) FROM jsonb_array_elements(i_arr) AS out;
END;
$$ LANGUAGE 'plpgsql';
你的回答基本不错。一些改进:
CREATE OR REPLACE FUNCTION extract_key_array(_key text, _arr jsonb)
RETURNS jsonb
LANGUAGE sql STABLE PARALLEL SAFE AS
$func$
SELECT jsonb_agg(elem -> _key) FROM jsonb_array_elements(_arr) elem;
$func$;
适用于您想要的函数调用:
SELECT extract_key_array('hello', '[{"hello": {"id": 1}} ,{"hello": {"id": 2}}]')
db<>fiddle here
一个简单的 SQL 函数就可以完成这项工作,并且可以 内联 。
声明函数
STABLE
和PARALLEL SAFE
(因为它是!)这允许在查询计划中进行各种优化。
(不要声明它IMMUTABLE
因为包含的jsonb_agg()
只是STABLE
出于某些未知原因。)你的回答调换了问题中函数参数的显示顺序
关于函数内联:
- Function executes faster without STRICT modifier?