2015-05-14 116 views
0

假设我有一个userscompanies表,其中1个用户可以为多个公司工作。在这种情况下,我使用JSON字段对其进行建模。Postgres:选择json字段数组中包含特定值的所有字段?

users 
- id: PK 
- jobs: json 

样品jobs领域:[{"company_id": 1, "title": "Engineer" }, {"company_id": 2, "title": "Accountant"}]

鉴于公司ID,是否有一种方式来运行一个SQL语句(Postgres的9.4),可以提取已在该公司工作的所有用户ID?喜欢的东西:

select id from users where map(jobs, "company_id") contains <?>

回答

2

可能不是做的最好的办法,但这个工程:

SELECT id FROM 
    (SELECT id, json_array_elements(jobs) as a FROM table) b 
WHERE a->>'company_id'='1'; 
+0

谢谢!这工作。我接受这个,因为这也适用于'json'字段类型。 @jgm的另一个答案也适用,但它需要你的字段是'jsonb'。 – huy

1

这应该做的伎俩:

SELECT id FROM users WHERE jobs @>'[{"company_id":1}]' 
+1

只需注意:使用这个需要'jsonb'数据类型,不会与'json'一起工作 –

+1

确实如此,但如果你在9.4你真的应该使用jsonb,除非你有一个特定的需求排除它。 – jgm

+0

是的,这就是为什么只是一个笔记。当然,对于一次性性能不敏感的查询,总是可以将json转换为jsonb。 –

相关问题