首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL不能将json类型转换为字符varying[]

PostgreSQL不能将json类型转换为字符varying[]
EN

Stack Overflow用户
提问于 2017-09-30 13:20:15
回答 1查看 5.1K关注 0票数 3

在我的Rails 5.0.5应用程序中,我需要将json string, array: true**.**列转换为

我的json列中的值如下:

代码语言:javascript
复制
[ "200px-RR5219-0015R.png", "2017_03_25_2235.doc", "137555.jpg" ]

我尝试过这种迁移:

代码语言:javascript
复制
class ChangeTaskAttachmentsTypeToString < ActiveRecord::Migration[5.0]
  def change
    change_column :tasks, :attachments, :string, array: true
  end
end

并得到了以下错误:

代码语言:javascript
复制
ActiveRecord::StatementInvalid: PG::DatatypeMismatch: ERROR:  column "attachments" cannot be cast automatically to type character varying[]
HINT:  You might need to specify "USING attachments::character varying[]".
: ALTER TABLE "tasks" ALTER COLUMN "attachments" TYPE character varying[]

然后我编辑了迁移:

代码语言:javascript
复制
class ChangeTaskAttachmentsTypeToString < ActiveRecord::Migration[5.0]
  def change
    change_column :tasks, :attachments, 'character varying[] USING attachments::character varying[]' 
  end
end

最后得到了这个错误:

代码语言:javascript
复制
PG::CannotCoerce: ERROR:  cannot cast type json to character varying[]
: ALTER TABLE "tasks" ALTER COLUMN "attachments" TYPE character varying[] USING attachments::character varying[]

我怎样才能进行这种迁移呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-30 14:55:00

我猜数组元素是文件名。如果是这样,则可以删除所有字符[]"和空格,并将结果拆分为数组,如下所示:

代码语言:javascript
复制
with my_table(attachments) as (
values
    ('[ "200px-RR5219-0015R.png", "2017_03_25_2235.doc", "137555.jpg" ]'::json)
)
select string_to_array(translate(attachments::text, '[] "', ''), ',')::varchar[]
from my_table;

                     string_to_array                     
---------------------------------------------------------
 {200px-RR5219-0015R.png,2017_03_25_2235.doc,137555.jpg}
(1 row)

因此,请使用:

代码语言:javascript
复制
... USING string_to_array(translate(attachments::text, '[] "', ''), ',')::varchar[]

一个更正式(更一般)的解决方案将需要一个自定义功能,例如:

代码语言:javascript
复制
create or replace function json_to_text_array(json)
returns text[] language sql immutable as $$
    select array_agg(value)
    from json_array_elements_text($1)
$$;

可以用在

代码语言:javascript
复制
alter table tasks alter column attachments type text[] 
    using json_to_text_array(attachments);

注意,我使用了text[]作为Postgres的一个更自然的选择,但是如果它重要的话,您可以用varchar[]代替它。

Db<>fiddle.中测试

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46503111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档