首页 > 解决方案 > 从 jsonb 类型的一列中获取多个值

问题描述

我需要得到drXY, fromXYdistInM但它们都在 1 列中。我无法选择additional_data作为获取所有列表的列,因为它不仅包含此信息。

在下图中,您可以看到此事件的确切列。

列

我没有尝试过任何事情,因为我不介意如何在 postgres 中执行此类请求

我希望看到这 2 个坐标和半径,就像请求的输出一样。

来自附加数据列的数据示例

{"cd":{"Query":"drXY:50.36212158,30.93627930,fromXY:50.36899347,30.92296243,distInM:1217"}}
 {"cd": {"Query": "drXY:50.35106277,30.95141602,fromXY:50.33421340,30.98074794,distInM:2805"}}
 {"cd": {"Query": "drXY:50.35106277,30.95141602,fromXY:50.33421340,30.98074794,distInM:2805"}}
 {"cd": {"Query": "drXY:50.34796524,30.95644951,fromXY:50.33421340,30.98074794,distInM:2309"}}
 {"cd": {"Query": "drXY:50.35132980,30.95157051,fromXY:50.33421340,30.98074794,distInM:2817"}}

标签: postgresql

解决方案


这有点棘手,因为实际的 Query 内容没有存储为正确的 JSON 值(这将使这变得非常容易)。我认为最简单的方法是在提取查询后使用正则表达式:

select substring(query from '(drXY:[0-9]+\.[0-9]+,[0-9]+\.[0-9]+)') as drxy,
       substring(query from '(fromXY:[0-9]+\.[0-9]+,[0-9]+\.[0-9]+)') as fromxy,
       substring(query, '(distInM:[0-9]+)') as dist
from (
  select additional_data -> 'cd' ->> 'Query' as query
  from the_table
  where additional_data -> 'cd' ? 'Query'
) t;

在线示例:https ://rextester.com/YDKB3888


推荐阅读