在Postgres 9.4

时间:2015-09-22 16:07:46

标签: arrays json postgresql nested

我需要一些帮助解析json,所以我可以对它进行分析。随位置附带的远程站点测量数据。

我已经回答了两个简单的问题,到目前为止,它已经给了我一个脑袋试图找出一些行为。

嵌套数组(四个深)是主要问题。我无法理解为什么jsonb_array_elements调用的横向连接不能完成这项工作。

我使用postgres 9.4.4

示例json在下面,而pg / sql正在尝试使用它。

这里是样本json。数据的解剖/规范和漂亮的版本可以在下面找到:

  

{    " SiteRep":{      " Wx":{        " Param":[          {            "姓名":" D",            "单位":"罗盘",            " $":" Wind Direction"          },          {            "姓名":" H",            "单位":"%",            " $":"屏幕相对湿度"          }        ]      },      " DV":{        " dataDate":" 2014-09-23T20:00:00Z",        "输入":" O",        "位置":[          {            "我":" 3002",            " lat":" 60.749",            " lon":" -0.854",            " name":" BALTASOUND",            "国家":"苏格兰",            "大陆":"欧洲",            "海拔":" 15.0",            "期间":[              {                "输入":" Day",                "价值":" 2014-09-22Z",                " Rep":[                  {                    " D":" SSW",                    " H":" 88.5",                    " $":" 1200"                  },                  {                    " D":" S",                    " H":" 91.6",                    " $":" 1260"                  },                  {                    " D":" SSW",                    " H":" 92.8",                    " $":" 1320"                  },                  {                    " D":" W",                    " H":" 92.8",                    " $":" 1380"                  }                ]              },              {                "输入":" Day",                "价值":" 2014-09-23Z",                " Rep":[                  {                    " D":" W",                    " H":" 88.5",                    " $":" 0"                  },                  {                    " D":" W",                    " H":" 86.7",                    " $":" 60"                  },                  {                    " D":" W",                    " H":" 86.2",                    " $":" 120"                  },                  {                    " D":" WSW",                    " H":" 87.9",                    " $":" 180"                  }                ]              }            ]          },          {            "我":" 3005",            " lat":" 60.139",            " lon":" -1.183",            "姓名":" LERWICK(S。SCREEN)",            "国家":"苏格兰",            "大陆":"欧洲",            "海拔":" 82.0",            "期间":[              {                "输入":" Day",                "价值":" 2014-09-22Z",                " Rep":[                  {                    " D":" SSW",                    " H":" 95.3",                    " $":" 1200"                  },                  {                    " D":" SSW",                    " H":" 97.4",                    " $":" 1260"                  },                  {                    " D":" SW",                    " H":" 97.3",                    " $":" 1320"                  },                  {                    " D":" W",                    " H":" 94.1",                    " $":" 1380"                  }                ]              },              {                "输入":" Day",                "价值":" 2014-09-23Z",                " Rep":[                  {                    " D":" WNW",                    " H":" 89.1",                    " $":" 0"                  },                  {                    " D":" WNW",                    " H":" 88.0",                    " $":" 60"                  },                  {                    " D":" W",                    " H":" 90.9",                    " $":" 120"                  },                  {                    " D":" W",                    " H":" 90.9",                    " $":" 180"                  }                ]              }            ]          }        ]      }    }   }

我正在使用此代码加载:

drop table if exists foo;
create table public.foo (data jsonb);

truncate foo;
copy foo from <example json as above>
DELIMITERS e'\x02';

第一个具体任务是计算&#34; D&#34;有价值的键&#34; S&#34;。
第二项任务是按照&#34; $&#34;的不同值对这些进行分组。键。

所以我只想用这个来解析json到pg表中:

select
"locations_entries"."date" as "location_date",
"locations_entries"."value" -> 'i' as "i",
"locations_entries"."value" -> 'lat' as "lat",
"locations_entries"."value" -> 'lon' as "lon",
-- "locations_entries"."value" -> 'Period' as "Period",
"locations_entries"."value" -> 'Period' -> 'value' as "p_value",
"locations_entries"."value" -> 'Period' -> 'type' as "type",
left("locations_entries"."value"::text,64) || '...'  as "value"
from
(
select "data" -> 'SiteRep' -> 'DV' -> 'dataDate' as "date",
"data" -> 'SiteRep' -> 'DV' -> 'type' as "type",
"location_entry"."value"
from foo,
lateral jsonb_array_elements(("data" -> 'SiteRep' -> 'DV' -> 'Location')::jsonb) location_entry --,
--lateral jsonb_array_elements("data" -> 'SiteRep' -> 'DV' -> 'Location' -> 'Period' ) period_entry
) "locations_entries"
order by "i"

注意第二个横向连接被注释掉了。更多关于第二个

的内容

上面的调用返回两行:

    location_date      |   i    |   lat    |   lon    | p_value | type |                                value                                
------------------------+--------+----------+----------+---------+------+---------------------------------------------------------------------
"2014-09-23T20:00:00Z" | "3002" | "60.749" | "-0.854" |         |      | {"i": "3002", "lat": "60.749", "lon": "-0.854", "name": "BALTASO...
"2014-09-23T20:00:00Z" | "3005" | "60.139" | "-1.183" |         |      | {"i": "3005", "lat": "60.139", "lon": "-1.183", "name": "LERWICK...

现在,如果我取消注释第二个横向连接,它将返回零行:

 location_date | i | lat | lon | value | type | value 
---------------+---+-----+-----+-------+------+-------
(0 rows)

然而,如果我看看&#34;数据&#34;的价值是什么? - &GT; &#39; SiteRep&#39; - &GT; &#39; DV&#39; - &GT; &#39;地点&#39; - &GT; &#39;时期&#39;是看我在其上调用jsonb_array_elements:

   i    |                               Period                                
--------+---------------------------------------------------------------------
 "3002" | [{"Rep": [{"$": "1200", "D": "SSW", "H": "88.5"}, {"$": "1260", ...
 "3005" | [{"Rep": [{"$": "1200", "D": "SSW", "H": "95.3"}, {"$": "1260", ...

哪(我认为)应该没问题。

任何想法我做错了什么以及如何将多个嵌套数组解析成表?

我尝试了herehere,但不能将这些解决方案应用于我的json,因为他们不够深入或者我误解了我的json。

0 个答案:

没有答案