我想将一个数组从 jsonb 字段复制到一个 PostgreSQL 数组列:
CREATE TABLE survey_results (
id integer NOT NULL,
areas text[],
raw jsonb DEFAULT '{}'::jsonb
);
INSERT INTO survey_results (id, raw)
VALUES (1, '{"areas": ["test", "test2"]}');
UPDATE survey_results SET areas = CAST(raw#>>'{areas}' AS text[]);
这还我?
ERROR: malformed array literal: "["test", "test2"]" Detail: "[" must introduce explicitly-specified array dimensions.
我该如何解决?
最佳答案
http://sqlfiddle.com/#!17/d8122/33
json 数组不能自转换为 postgres 数组。您需要正确解析和转换它(json_array_elements
、unnest
、array_agg
),或者使用一些猴子技巧,例如:
UPDATE survey_results
SET areas = concat('{',translate(raw#>>'{areas}','"',$$'$$),'}')::text[];
上面我通过更改引号“准备”了 json 数组,因此它们将是文字,而不是标识符,并将其准备为 postgres 数组文本表示 '{}'
作为替代smth像:
with a as (
select jsonb_array_elements_text(raw#>'{areas}') e from survey_results
)
, b as (
select array_agg(e) ag from a
)
UPDATE survey_results
SET areas = ag::text[]
FROM b;
select * from survey_results
;
可以使用——为了更安全的“类型转换”
关于sql - 格式错误的数组文字 - PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48866673/