【问题标题】:How to apply a function to each element of a json array?如何将函数应用于json数组的每个元素?
【发布时间】:2021-05-25 08:53:21
【问题描述】:

给定这个函数:

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}]'

【问题讨论】:

    标签: arrays postgresql plpgsql jsonb


    【解决方案1】:

    你的回答基本不错。一些改进:

    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小提琴here

    • 一个简单的 SQL 函数就可以完成这项工作,并且可以内联

    • 声明函数STABLEPARALLEL SAFE(因为它!)这允许查询计划中的各种优化。
      (不要声明它IMMUTABLE,因为包含的jsonb_agg() 只是STABLE,原因不明。)

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

    关于函数内联:

    【讨论】:

      【解决方案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';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 2016-08-19
        • 1970-01-01
        相关资源
        最近更新 更多