字符串操作在插入 PostgreSql Jsonb 列时抛出错误
String Manipulation throws error while Inserting into PostgreSql Jsonb Column
我有以下代码,用于将数据插入我的 table res(ID bigserial,
结果 jsonb 不为空)。我想插入数据,以便 'Display' 列始终附加 'i',以便每一行对 'Display' 列都有不同的值。
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.
我应该如何修改我的查询以使查询 运行 成功?
不需要循环甚至 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 行具有 相同的 值 display
。
我有以下代码,用于将数据插入我的 table res(ID bigserial, 结果 jsonb 不为空)。我想插入数据,以便 'Display' 列始终附加 'i',以便每一行对 'Display' 列都有不同的值。
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.
我应该如何修改我的查询以使查询 运行 成功?
不需要循环甚至 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 行具有 相同的 值 display
。