web-dev-qa-db-ja.com

postgresql関数でjsonbオブジェクトのキー/値ペアをループする

特定のjsonbオブジェクトの各キー/値ペアをループできる関数をPostgresで作成しようとしています。

create or replace function myFunction
(input jsonb)
returns jsonb as $$
BEGIN

    // foreach(key in input)
    //       do some math operation on its corresponding value

    returns input;

END; $$

引数入力は、{"a":1, "b":2, "c":3}などのjsonbオブジェクトであることが期待されています。

オブジェクトの各キー/値のペアをループ処理したいと思います。私のコメントからわかるように、私はcやJavaなどのより汎用的なプログラミング言語でバックエンドコードを記述していたため、SQLは得意ではありません。私はオンラインで検索を試みましたが、オブジェクトの代わりにjsonb配列をループする方法について話しています。本当にここにこだわっています。

3
JaneL

FOR loop のように jsonb_each(jsonb)またはjsonb_each_text(jsonb) を使用します。

CREATE OR REPLACE FUNCTION my_function(input jsonb)
  RETURNS jsonb
  LANGUAGE plpgsql AS  -- language declaration required
$func$
DECLARE
   _key   text;
   _value text;
BEGIN
    FOR _key, _value IN
       SELECT * FROM jsonb_each_text($1)
    LOOP
       -- do some math operation on its corresponding value
       RAISE NOTICE '%: %', _key, _value;
    END LOOP;

    RETURN input;
END
$func$;

コール:

SELECT my_function('{"a":1, "b":2, "c":3}');

関連:

C、Javaなどのプログラミング言語に慣れている多くの問題はループを使用する傾向があることに注意してください。SQLにはすぐ近くに優れたセットベースのソリューションがあります。 。並列コードの例:

1