格式错误的数组文字 - PostgreSQL

时间:2018-02-19 12:52:53

标签: sql postgresql

我想将一个数组从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/2

1 个答案:

答案 0 :(得分:2)

http://sqlfiddle.com/#!17/d8122/33

json数组不能自行转换为postgres数组。您需要正确解析并投射它(json_array_elementsunnestarray_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
  ;

可用于 - 更安全"铸造"