Json 使用PostgreSQL查询哈希的嵌套哈希

Json 使用PostgreSQL查询哈希的嵌套哈希,json,postgresql,jsonb,Json,Postgresql,Jsonb,我有一个json数据类型字段来存储复杂的数据。JSON数据如下所示: { 0 => { 原点=>{}, 差异=>{ 类型=>类型_1, ... } }, 1 => { 来源=>{ 类型=>类型2, ... }, 差异=>{ ... } }, ... } 我曾尝试将json转换为数组以避免这些索引键,但这对我没有帮助 数据_值为 选择id,array_to_jsonarrayse从json_中选择t.v每个_textdata作为tk,v作为array_数据 从事件日志 从数据值中选择* 其中,数组

我有一个json数据类型字段来存储复杂的数据。JSON数据如下所示:

{ 0 => { 原点=>{}, 差异=>{ 类型=>类型_1, ... } }, 1 => { 来源=>{ 类型=>类型2, ... }, 差异=>{ ... } }, ... } 我曾尝试将json转换为数组以避免这些索引键,但这对我没有帮助

数据_值为 选择id,array_to_jsonarrayse从json_中选择t.v每个_textdata作为tk,v作为array_数据 从事件日志 从数据值中选择* 其中,数组_数据->'origin'>>'type'='type_3'或数组_数据->'diff'>>'type'='type_3' 另外,我有一个想法,使用json_object_键并迭代顶级键以找到必要的键/值对,但我是PSQL的新手,在解决这个问题时遇到了一些问题

PSQL的版本是11,所以JSON路径对我来说不可用

表定义示例:

创建表事件日志 id整数, 数据json, 在不带时区的时间戳处创建\u ; 在事件日志id、数据中插入 价值观 1,{0:{origin:{},diff:{type:type_1}},1:{origin:{type:type_1},diff:{}, 2,“{0:{origin:{},diff:{type:type_2}},1:{origin:{},diff:{type:type_3}},”, 3,“{0:{origin:{},diff:{type:type_3}},1:{origin:{type:type_2},diff:{}” 重要提示:顶级键的计数可能不同

我想通过键/值对查找记录,例如,type='type_3'。它应该选择ID为2和3的记录


你能帮我把它做好吗?

将对象存储为数组而不是整数索引对象是一个好主意,但这不允许使用->运算符跳过这一级别。只有jsonpath可以做到这一点

在WHERE子句中,每次迭代都需要使用json_:


如果您使用了数组,每个json\u都将成为json\u数组\u元素。

您期望的输出是什么?您可以发布json文本,而不是散列吗?还包括您的表定义和您尝试的查询。@S-Man我想选择具有必要条件的所有记录。@Bergi更新了主帖。如果没有人工索引号和真实数组,查询会更容易:谢谢您的解决方案,这就是我需要的。顺便说一句,这不是我决定以这种奇怪的方式存储数据而不是散列数组:将对象存储为数组而不是整数索引对象是一个好主意,-我实际上试图避免这种情况。在这种情况下,如果顶级JSON是一个数组,那么查询将更容易编写:-理论上,它甚至可以在列上使用GIST索引then@a_horse_with_no_name这就是我想说的,使用数组更好。
SELECT * FROM data_values
WHERE EXISTS(
  SELECT *
  FROM json_each(data)
  WHERE value->'origin'->>'type' = 'type_3'
     OR value->'diff'->>'type' = 'type_3'
);