【问题标题】:Queries involving data passed via JSONB涉及通过 JSONB 传递的数据的查询
【发布时间】:2019-02-13 10:10:10
【问题描述】:

好的,所以我有一个函数,它采用JSONB 类型,并根据来自该数据块的各种键执行SELECTINSERT。 PostgreSQL 抛出关于 PERFORMINSERT 的错误。 SQL查询中json数据的正确用法是什么?

CREATE OR REPLACE FUNCTION add_revision(d jsonb)
RETURNS jsonb AS $$
DECLARE
    did INT;
BEGIN
    did:=get_drawing_id(d->>'Name');
    IF did=NULL THEN
        did:=create_drawing(d->>'Name',d->>'Discipline',
            d->>'Doc Type');
    END IF;
    PERFORM * FROM revisions WHERE drawingid=did AND Sequence=d->>'Sequence';
    IF NOT FOUND THEN
        INSERT INTO revisions (Sequence,Revision,State,Meta) VALUES(d->>'Sequence',
            d->>'Version',d->>'State',d);
        RETURN jsonb_build_object('ok',true);
    END IF;
    RETURN jsonb_build_object('ok',false,'message','Already exists');
END;
$$ LANGUAGE plpgsql;

这是抛出的错误

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42883]: Un
defined function: 7 ERROR:  operator does not exist: integer = text
LINE 1: ... * FROM revisions WHERE drawingid=did AND Sequence=(d->>'Seq...

【问题讨论】:

    标签: json postgresql plpgsql


    【解决方案1】:

    您不能将整数与文本进行比较。 PostgreSQL 很严格。

    检查此部分中的类型。

     drawingid=did AND Sequence=d->>'Sequence'
    

    这应该不是与 JSONB 相关的问题。

    【讨论】:

      【解决方案2】:

      在查询中使用 JSONB 函数非常好,我只需要将类型转换为所需的类型:

      CREATE OR REPLACE FUNCTION add_drawing_revision(d jsonb)
      RETURNS jsonb AS $$
      DECLARE
          did INT;
      BEGIN
          did:=get_drawing_id(d->>'Name');
          IF did<0 THEN
              did:=create_drawing(d->>'Name',d->>'Discipline',
                  d->>'Doc Type');
          END IF;
          PERFORM * FROM revisions WHERE drawingid=did AND Sequence=(d->>'Sequence')::INT;
          IF NOT FOUND THEN
              INSERT INTO revisions (Sequence,Revision,State,Meta) VALUES((d->>'Sequence')::INT,
                  d->>'Version',d->>'State',d);
              RETURN jsonb_build_object('ok',true);
          END IF;
          RETURN jsonb_build_object('ok',false,'message','Already exists');
      END;
      $$ LANGUAGE plpgsql;
      

      【讨论】:

        猜你喜欢
        • 2016-07-26
        • 1970-01-01
        • 2021-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-20
        • 1970-01-01
        相关资源
        最近更新 更多