如何将函数应用于 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 函数就可以完成这项工作,并且可以 内联

  • 声明函数STABLEPARALLEL SAFE(因为它!)这允许在查询计划中进行各种优化。
    (不要声明它 IMMUTABLE 因为包含的 jsonb_agg() 只是 STABLE 出于某些未知原因。)

  • 你的回答调换了问题中函数参数的显示顺序

关于函数内联:

  • Function executes faster without STRICT modifier?