sql - 格式错误的数组文字 - PostgreSQL

标签 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

最佳答案

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
  ;

可以使用——为了更安全的“类型转换”

关于sql - 格式错误的数组文字 - PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48866673/

相关文章:

php - 一个 SQL 行到一个 UILabel

r - 如何使用 R 和 Rpostgres 使用参数化查询,以便接受变量中包含的值作为 psql 的输入

postgresql - 如何在 postgresql 中只允许字母数字字段值

ruby-on-rails - Rails 可选关联查询

sql - 大型 PostgreSQL 表 : better to add a column or create a new table to store metadata?

mysql - 选择 id(在本例中为 dupersid),其中第二列(在本例中为 icd9codx)的值仅在 (296, 311) 和 250 中

mysql - 计算每天两个日期之间的时间

sql - 如何在SQL Server Compact中获取特定表的当前标识号

mysql - MSSQL 到 MYSQL - 从 MSSQL 中选择,插入 MySQL

postgresql - 使用 NestJS、TypeORM 和 Docker 运行数据库迁移时出错