2017-08-08 76 views
1

我有一个类型为jsonb的列。此列中的数据看起来如下如何从jsonb列中选择数据?

{ 
    "random_number1": 
    { 
     "random_number2": 
     { 
      "Param1": 2, 
      "Param2": 0, 
      "Param3": 0, 
      "Param4": 6, 
      "Param5": 3 
     } 
    } 
} 

如何为该列写入select如果我想f.e. “Param3”= 6的所有行? 我试过类似的东西

SELECT * FROM table WHERE column->'Param3' @> '6'::jsonb; 

回答

2

这取决于您的期望。

获取指定路径的值:

select * 
from my_table 
where my_col->'random_number1'->'random_number2'->>'Param3' = '6' 

获得第三级别的任何对象的关键Param3的价值:

select t.* 
from my_table t, 
jsonb_each(my_col) as level1(key1, value1), 
jsonb_each(value1) as level2(key2, value2) 
where jsonb_typeof(my_col) = 'object' 
and jsonb_typeof(value1) = 'object' 
and value2->>'Param3' = '6'; 

在第二种情况下,你可能想使用distinct,因为查询可能会产生重复的行。

+0

问题是,random_number1和random_number2总是不同的数值 – Jens

+0

因此,你有两种变体的答案。使用第二个。 – klin

+0

但在第二种情况下,我收到了一个错误“无法在非对象上调用jsonb_each” – Jens