2017-07-13 226 views
0

如何使用postgres查询从下面的json字符串化字符串获取值?我正在使用正则表达式来做到这一点,但我试图写一些更通用/简单/可信的查询。是的,我不相信我写的东西,我非常确定我会有什么打破。使用postgres从Json字符串化字符串获取数据

这是我有:

SELECT 
trim(both '" 'FROM replace(regexp_replace('phone_data', '[\\] 
{2,}"([^,:])', '\1', 'g'), '\"', '"'))::json -> 'objects' -> 0 -> 'data' -> 'gpslogs' -> 0 ->> 'cataract' 
FROM 
    "JSON" 
WHERE 
    "ID" = 'eb7613c6-e7aa-4b46-984e-ebf334293fdb'; 

这是该数据的样子:

{ 
"glossary": { 
    "title": "example glossary", 
    "GlossDiv": { 
     "title": "S", 
     "GlossList": { 
      "GlossEntry": { 
       "ID": "SGML", 
       "SortAs": "SGML", 
       "GlossTerm": "Standard Generalized Markup Language", 
       "Acronym": "SGML", 
       "Abbrev": "ISO 8879:1986", 
       "GlossDef": { 
        "para": "A meta-markup language, used to create markup languages such as DocBook.", 
        "GlossSeeAlso": ["GML", "XML"] 
       }, 
       "GlossSee": "markup" 
      } 
     } 
    } 
} 

}

感谢您的帮助和建议。谢谢。

+0

您不应该在PostgreSQL中使用正则表达式来操作JSON。 [Postgres有大量用于搜索和操作JSON数据的JSON函数](https://www.postgresql.org/docs/current/static/functions-json.html)。你想从这个JSON中获得什么? – Schwern

+0

我们假设在这个例子中,我想要海拔高度场 – Anusha

+0

@Schwern你是否也注意到在开始和结尾处多出一对双引号 – Anusha

回答

0

看来你已经双重编码JSON数据。所有真正的JSON似乎被捣毁成一个大字符串值,然后你必须解码,解析为JSON(击败JSONB),然后搜索。

经验法则是不要尝试使用垃圾数据。相反,修复它,然后处理所产生的清洁数据。这使得一切都变得更快捷,减少错误,使用更少的内存,并节省了大量的编程时间。

这意味着要做一个单独的update来修复JSON数据。确保在执行此操作时进行事务处理,以便在出错时可以回滚。而且您必须更改导入器才能在插入之前修复传入的数据。最后,可能会有其他查询假设JSON格式错误,必须将其更改为使用明智的JSON。

然后您可以正常查询JSONB列。

select phone_device_data->'objects'->0->'data'->'gps_location_logs'->0->>'latitude' 
from json_storage 
where id = 'eb7613c6-e7aa-4b46-984e-ebf334293fdb'; 
+0

不行,不适合我。你删除了多余的引号并尝试这个吗? – Anusha

+0

@Anusha如果你发布的所有奇怪的转义值都是'phone_device_data'列中的值,那么你的数据就会非常非常非常错误。您发布了无效的JSON,并且JSONB字段不能包含无效的JSON。我怀疑'phone_device_data'实际上并不是JSONB,或者它只是一个带有转义乱码的大字符串字段,或者你发布的东西不是真正的值(即通过某个GUI或程序过滤)。也许粘贴'从json_storage中选择phone_device_data,其中id ='eb7613c6-e7aa-4b46-984e-ebf334293fdb''某处。 – Schwern

+0

相信我,就是这样。这就是为什么我使用正则表达式。 – Anusha