【问题标题】:Transforming HSTORE array values to a column in JSONB将 HSTORE 数组值转换为 JSONB 中的列
【发布时间】:2020-12-11 15:07:42
【问题描述】:

我正在尝试转换存储在 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 中尝试了松散的函数,没有帮助。

【问题讨论】:

  • 请添加一些可重现的样本数据
  • 请向我们展示一些可重现/准确的东西。我得到ERROR: function hstore_to_jsonb_loose(text) does not exist
  • 嗨,我刚刚在描述中添加了更多内容。 @AkhileshMishra,这是 hstore 中一行的值。 "entity" => "[{'id': '11954_179415600_2441_333_1', 'vehicle': {'trip': {'tripId': '1182456', 'routeId': '2441_333', 'startDate': '20200822', 'startTime':'22:14:00','scheduleRelationship':'SCHEDULED'},'车辆':{'id':'11954_179415600_2441_333_1'},'位置':{'速度':0.0,'轴承': 297.0,'纬度':-33.876972,'经度':151.21237},'时间戳':'1598100524','congestionLevel':'RUNNING_SMOOTHLY','occupancyStatus':'MANY_SEATS_AVAILABLE'}}]"
  • {'id': …} 不是有效的 JSON。 {"id": …} 会。如果你的值看起来像这样,你可以使用(data -> 'entity')::jsonb。 (注意hstore_to_jsonb_loose 是绝对没有必要的,因为-> 'entity' 已经访问了hstore 中的字符串值)。
  • 请不要在 cmets 中添加额外的信息(尤其不是“代码”类型的东西)。 edit 改为您的问题

标签: arrays postgresql jsonb hstore


【解决方案1】:

根据我的理解,您有一个类型为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'entity' 的值,即"[{'id':..........}]"

  1. 您希望将从hstore_to_jsonb_loose(data) -> 'entity' 获取的值存储为完整的JSON ARRAY。您作为值存储在hstore 类型列中的数据看起来像JSON,但它不是JSON。在JSON 中,键和值(数字和布尔值除外)被" 包围,但在您的字符串中它被' 包围。所以不能在JSONB类型列中存储为JSON

  2. 考虑到 JSON 格式的值结构没有其他问题(' 除外)。我们应该将' 替换为" 并将值作为JSONB 存储在列中。试试这个查询来做同样的事情。

Alter TABLE test 
   ALTER COLUMN h_store_column TYPE jsonb 
   USING replace(hstore_to_jsonb_loose(data)->>'entity','''','"')::jsonb;

DEMO1

在您的情况下,即使是 hstore_to_jsonb_loose 也不需要。您可以编写您的Alter 声明如下:

Alter TABLE test 
   ALTER COLUMN h_store_column TYPE jsonb 
   USING replace((data)->'entity','''','"')::jsonb;

DEMO2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    相关资源
    最近更新 更多