Postgres 9.4按json数组的元素值选择

Postgres 9.4按json数组的元素值选择,json,postgresql,jsonb,Json,Postgresql,Jsonb,有一个“accounts”表,其中包含“data”::jsonb字段,其中填充了: { "cars": [{"body": "E-JZA80-ALFQZ", "year": 1999, "brand": "Toyota", "model": "Vista Ardeo"} ], "name": "Gilbert Moore", "phone": "+13222314555" } 我试着说: 从账户

有一个“accounts”表,其中包含“data”::jsonb字段,其中填充了:

{
    "cars": [{"body": "E-JZA80-ALFQZ", 
         "year": 1999, 
         "brand": "Toyota", 
         "model": "Vista Ardeo"} 
     ], 
    "name": "Gilbert Moore", 
    "phone": "+13222314555"
}
我试着说:
从账户中选择*数据->“汽车”@>“{”品牌“:“丰田”}”

但是它没有显示记录。您遗漏了什么?

您的查询需要以下格式的json值:

{
    "cars": {"body": "E-JZA80-ALFQZ", 
         "year": 1999, 
         "brand": "Toyota", 
         "model": "Vista Ardeo"} 
     , 
    "name": "Gilbert Moore", 
    "phone": "+13222314555"
}
但是在实际数据中,
data->“cars”是一个数组,而不是一个对象,因此查询应该是:

select a.*
from accounts a
where data->'cars' @> '[{"brand":"Toyota"}]'

as操作符@>适用于两个对象或两个数组。

我喜欢交叉连接解决方案。但是运营成本呢?例如,我有1000万条记录,每条记录中有1-3辆车。我认为对1000万行的查询可能需要一分钟或几分钟。对于大量数据,我个人更愿意将json转换为标准化表。最初,您必须花费额外的时间来设计表和插入/更新函数,但从长远来看,这会带来实实在在的好处。原则上,如果行数可能大于100000,我不使用jsonb类型。