将HSTORE数组值转换为JSONB中的列

问题描述

我正在尝试转换存储在Postgres的HSTORE列(“数据”)中的数据。

我的行值具有键“实体”,值在数组中。

"entity"=>"[{'id': .............}]

我使用了以下代码

Alter TABLE my_table 
   ALTER COLUMN h_store_column TYPE jsonb 
   USING hstore_to_jsonb_loose(data -> 'entity');

导致值作为新列中的输出,如下所示:

"[{'id': .............}]"

,但带引号""。这使其在JSONB类型列中成为标量,并且不允许我运行查询

如何在不带引号的情况下使用JSONB更改名为“实体”的新列中每一行的值?

[{'id': .............}]

用于生成相似数据的示例代码

"key" => "[json_text_array]"

存储在hstore数据类型列中。

当更改为JSON B类型时,我得到{'key':'[array]'},而我在{'key': [array]}之后-没有引号。我在postgres中尝试了松散函数,没有帮助。

解决方法

根据您所理解的问题,您有一列类型为hstore的列,其关键字为entity,其值为JSON ARRAY。您的问题和解决方案的说明如下:

  1. 问题中提到的您的Alter查询将出错,因为hstore_to_jsonb_loose函数接受hstore类型的值,但是您正在传递text。因此,正确的查询语句应该是。
    Alter TABLE my_table 
       ALTER COLUMN h_store_column TYPE jsonb 
       USING hstore_to_jsonb_loose(data) -> 'entity';
  1. 以上查询会将hstore键值转换为jsonb键值对,并将其更新到列h_store_column中。

因此,函数hstore_to_jsonb_loose会将数据转换为{ "entity": "[{'id':..........}]" },您将从中提取键JSON的{​​{1}}值'entity'。 / p>

  1. 您要将从"[{'id':..........}]"获取的值存储为完整hstore_to_jsonb_loose(data) -> 'entity'。作为值存储在JSON ARRAY类型列中的数据看起来像hstore,而不是JSON。在JSON中,键和值(数字和布尔值除外)用JSON包围,但是在您的字符串中,其用"包围。因此不能将其作为'存储在 JSONB 类型列中。

  2. 考虑到JSON的值结构中没有其他问题(JSON除外)。我们应该将'替换为',并将值存储为JSONB。尝试使用此查询执行相同的操作。

"

DEMO1

您的情况甚至不需要Alter TABLE test ALTER COLUMN h_store_column TYPE jsonb USING replace(hstore_to_jsonb_loose(data)->>'entity','''','"')::jsonb; 。您可以如下编写hstore_to_jsonb_loose语句:

Alter

DEMO2