问题描述
我正在尝试转换存储在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
。您的问题和解决方案的说明如下:
- 问题中提到的您的
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';
- 以上查询会将
hstore
键值转换为jsonb键值对,并将其更新到列h_store_column
中。
因此,函数hstore_to_jsonb_loose
会将数据转换为{ "entity": "[{'id':..........}]" }
,您将从中提取键JSON
的{{1}}值'entity'
。 / p>
-
您要将从
"[{'id':..........}]"
获取的值存储为完整hstore_to_jsonb_loose(data) -> 'entity'
。作为值存储在JSON ARRAY
类型列中的数据看起来像hstore
,而不是JSON
。在JSON
中,键和值(数字和布尔值除外)用JSON
包围,但是在您的字符串中,其用"
包围。因此不能将其作为'
存储在 JSONB 类型列中。 -
考虑到JSON的值结构中没有其他问题(
JSON
除外)。我们应该将'
替换为'
,并将值存储为JSONB。尝试使用此查询执行相同的操作。
"
您的情况甚至不需要Alter TABLE test
ALTER COLUMN h_store_column TYPE jsonb
USING replace(hstore_to_jsonb_loose(data)->>'entity','''','"')::jsonb;
。您可以如下编写hstore_to_jsonb_loose
语句:
Alter