【问题标题】:String Manipulation throws error while Inserting into PostgreSql Jsonb Column插入 PostgreSql Jsonb 列时字符串操作抛出错误
【发布时间】:2017-02-02 15:39:31
【问题描述】:

我有以下代码,将数据插入我的表 res(ID bigserial, 结果 jsonb 不为空)。我想插入数据,以便“显示”列始终附加“i”,以便每一行都有不同的“显示”列值。

DO $$
declare cnt bigint;
BEGIN
FOR i IN 1..2 LOOP
    INSERT INTO res (Results)
        VALUES ('{"cid":"CID1","Display":"User One'|| i || '","FName":"Userfff","LName":"One"}'); 
    INSERT INTO res (Results)
        VALUES ('{"cid":"CID1","Display":"User One'|| i || '","FName":"Userfff","LName":"One"}');
    INSERT INTO res (Results)
        VALUES ('{"cid":"CID1","Display":"User One'|| i || '","FName":"Userfff","LName":"One"}');
END LOOP;
END;
$$
LANGUAGE plpgsql;

但是,当我运行此代码时,我收到以下错误:

ERROR:  column "results" is of type jsonb but expression is of type text
LINE 2:             VALUES ('{"cid":"CID1","Display":"User One'|| i ...
                        ^
HINT:  You will need to rewrite or cast the expression.

我应该如何修改我的查询以使查询成功运行?

【问题讨论】:

  • 您的循环将插入 6 行,其中 3 行具有相同的 Display 值,这真的是您想要的吗?

标签: postgresql jsonb


【解决方案1】:

不需要循环甚至 PL/pgSQL。

您可以使用generate_series() 生成任意数量的行

要将值放入字符串中,我更喜欢使用format(),因为这样可以更轻松地处理字符串:

insert into res(results)
select format('{"cid":"CID1","Display":"User One %s","FName":"Userfff","LName":"One"}', i::text)::jsonb
from generate_series(1,5) g(i);

format() 函数的第二个参数将放在第一个参数中%s 的位置。

上面插入了 5 行,每行都有不同的 display 值。这就是你在问题中所说的。但是,您的示例代码总共插入了 6 行,其中 3 行具有displaysame 值。

【讨论】:

  • 谢谢,它成功了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 2022-11-02
  • 1970-01-01
  • 2016-05-12
相关资源
最近更新 更多