【问题标题】:Concatenate values in Json object in postgres 9.6 function在 postgres 9.6 函数中连接 Json 对象中的值
【发布时间】:2019-03-02 18:52:25
【问题描述】:

我试图在 postgres 函数中迭代一个 json,接收一个 json 数组,我很困惑如何连接对象中的一些值,然后添加到一个 json 对象数组,我的代码是下一个

CREATE OR REPLACE FUNCTION setProduct(val json) 
RETURNS JSON AS $$
DECLARE 
varvariedad INTEGER;
vartallo INTEGER;
varlista INTEGER;
varcaja INTEGER;
objetoinsert JSON;
objetorespuesta JSON;
objetovariedadesnot JSON;
objetopreciosnot JSON;

i JSON;
BEGIN 
objetoinsert :='[]';
objetorespuesta :='[]';
objetovariedadesnot:='[]';
objetopreciosnot :='[]';

 FOR i IN SELECT * FROM json_array_elements(val)
  LOOP
  /*valido variedad*/
    varvariedad:=0;
    select id into varvariedad from variedad_flors where nombre = trim( i->>'nombre');

        IF varvariedad  > 0 THEN
        vartallo:=0;
        select id into vartallo from tallos where nombre = trim( i->>'tallo');

                IF vartallo == 0 THEN
                objetovariedadesnot := objetovariedadesnot || '{"error":"No existe Tallo", "qty": "'||trim( i->>'qty')||'", "caja": "'||trim( i->>'caja')+'", "tallo": "'||trim( i->>'tallo')||'", "precio": "'|| trim( i->>'precio')||'"}'::jsonb; 
                ELSE
                varcaja:=0;
                select id into varcaja from tallos where nombre = trim( i->>'caja');

                        IF varcaja == 0 THEN
                        objetovariedadesnot := objetovariedadesnot || '{"error":"No existe Caja", "qty": "'||trim( i->>'qty')||'", "caja": "'||trim( i->>'caja')||'",, "tallo": "'||trim( i->>'tallo')||'", "precio": "'||trim( i->>'precio')||'"}}'::jsonb;    

                        ELSE
                         varlista:=0;
                         select id into varlista from listaprecio where variedad = trim(varvariedad);

                            IF varlista == 0 THEN
                                objetopreciosnot := objetopreciosnot || '{"error":"No existe List de precio", "qty": "'||trim( i->>'qty')||'", "caja": "'||trim( i->>'caja')||'", "tallo": "'||trim( i->>'tallo')||'", "precio": "'||trim( i->>'precio')||'"}'::jsonb;  
                            ELSE
                                objetoinsert := objetoinsert ||'{"id_listaprecios":"'||varlista||'", "cantidad": '|| i->>'qty'||', "id_variedad": "'||varvariedad||'"}';
                            END IF;
                        END IF; 
                END IF;
        ELSE
                 objetovariedadesnot := objetovariedadesnot || '{"error":"No existe variedad", "qty": "'||trim( i->>'qty')||'", "caja": "'||trim( i->>'caja')||'", "tallo": "'||trim( i->>'tallo')||'", "precio": ' || trim( i->>'precio')|| '}'::jsonb;    
        END IF;
  END LOOP;

END;
$$ LANGUAGE PLpgSQL;

错误即将连接“}}”,我如何以正确的方式连接所有内容以避免下一个错误

ERROR:  invalid input syntax for type json
LINE 1: ...tallo')||'", "precio": ' || trim( i->>'precio')|| '}}'::json...
                                                             ^
DETAIL:  Expected JSON value, but found "}".
QUERY:  SELECT objetovariedadesnot || '{"error":"No existe variedad", "qty": "'||trim( i->>'qty')||'", "caja": "'||trim( i->>'caja')||'", "tallo": "'||trim( i->>'tallo')||'", "precio": ' || trim( i->>'precio')|| '}}'::jsonb
CONTEXT:  JSON data, line 1: }...
PL/pgSQL function setproduct(json) line 50 at assignment

********** Error **********

ERROR: invalid input syntax for type json
SQL state: 22P02
Detail: Expected JSON value, but found "}".
Context: JSON data, line 1: }...
PL/pgSQL function setproduct(json) line 50 at assignment

非常感谢您的帮助,我在 google 中搜索此内容,但找不到与我的错误类似的内容

【问题讨论】:

  • 如果您使用 Postgres JSON 函数作为 json_insert() 而不是字符串连接会更好。他们确保 JSON 结构保持有效postgresql.org/docs/current/static/functions-json.html
  • 谢谢,我真的把一切都复杂化了,我将函数更改为保存在临时表中而不是推入数组,然后,完成迭代,读取表并转换为 json

标签: arrays json postgresql loops


【解决方案1】:

我开始学习 postgres 时迷路了,我改变了函数的逻辑,所以如果有人需要做一些类似的事情,这是代码,最后我转换了一些 json 值,将所有内容保存在临时表中,然后回答,读取临时表并转换为json,所以最后我们不需要将字符串与json值连接

CREATE OR REPLACE FUNCTION setProduct(val json) 
RETURNS JSON AS $$
DECLARE 
varvariedad INTEGER;
vartallo INTEGER;
varlista INTEGER;
varcaja INTEGER;
objetoinsert JSON;
objetorespuesta JSON;
i JSON;
BEGIN 

/*
   CREATE TEMPORARY TABLE tmp_respuesta
   (
      error bigint,
      message VARCHAR(150),
      variedad VARCHAR(150),
      qty bigint,
      caja VARCHAR(20),
      tallo varchar(20)
   ) 
   ON COMMIT DELETE ROWS;*/

 FOR i IN SELECT * FROM json_array_elements(val)
  LOOP
  /*valido variedad*/
    varvariedad:=0;
        raise notice 'empiezo: %',i->>'variedad' ;
    select id into varvariedad from variedad_flors where nombre = trim( i->>'variedad');

        IF varvariedad  > 0 THEN
        vartallo:=0;
        select id into vartallo from tallos_flors where nombre = trim( i->>'tallo');

                IF vartallo = 0 THEN
                insert into temp_variedadesnot 
                (error,message,variedad,qty,caja,tallo) VALUES (1,'No existe Tallo',varlista,i->>'variedad',i->>'qty'::BIGINT,i->>'caja',i->>'tallo');
                ELSE
                varcaja:=0;
                select id into varcaja from cajas_flors where nombre = trim( i->>'caja');

                        IF varcaja = null THEN
                        insert into tmp_respuesta 
                        (error,message,variedad,qty,caja,tallo) VALUES (1,'No existe caja',i->>'variedad',(i->>'qty')::BIGINT,i->>'caja',i->>'tallo');
                        ELSE
                         varlista:=0;
                         select id into varlista from listaprecios where id_tipoflor = varvariedad;

                            IF varlista = 0 THEN
                                insert into tmp_respuesta (error,message,variedad,qty,caja,tallo) VALUES 
                                (2,'No existe Lista de precio',i->>'variedad',(i->>'qty')::BIGINT,i->>'caja',i->>'tallo');
                            ELSE
                                insert into productos (id_listaprecios,cantidad,id_variedad) VALUES (varlista,(i->>'qty')::BIGINT,varvariedad);
                                insert into tmp_respuesta (error,message,variedad,qty,caja,tallo) VALUES 
                                (0,'Registro Exitoso',i->>'variedad',(i->>'qty')::BIGINT,i->>'caja',i->>'tallo');
                            END IF;
                        END IF; 
                END IF;
        ELSE
             insert into tmp_respuesta 
             (error,message,variedad,qty,caja,tallo) VALUES (1,'No existe Variedad' ,varlista,(i->>'qty')::BIGINT,i->>'caja',i->>'tallo');
        END IF;
  END LOOP;


    select json_agg(row_to_json(tmp_respuesta)) into objetoinsert from tmp_respuesta;
    return objetoinsert ; 
END;
$$ LANGUAGE PLpgSQL;

【讨论】:

    猜你喜欢
    • 2018-12-30
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    相关资源
    最近更新 更多