Postgres JSONB 从数据数组中执行 select
Postgres JSONB do a select from an array of data
我正在使用 Postgres 数据库,并且正在尝试使用新的 JSONB 类型。我有一个名为 employees
的 table 和一个名为 previous_companies
的列,其中包含以下 JSON 数据:
[{"company":"Facebook", "link": "www.facebook.com"}, {"company":"Google", "link": "www.google.com"}, {"company":"Some Face", "link": "www.someface.com"}]
我正在尝试 select 所有具有字段 "company" 特定字符串的员工,例如:
- 如果我想要在一家公司工作的所有员工,名字上有 "face" 我会:
[{"company":"Facebook", "link": "www.facebook.com"}, {"company":"Some Face", "link": "www.someface.com"}]
我能够查询 EXACT 字符串,如下所示:
SELECT * FROM employees WHERE previous_companies @> '[{"company":"Facebook"}]'
但它 returns 这个:[{"company":"Facebook", "link": "www.facebook.com"}]
如您所见,不支持查询不完整的字符串。
谢谢!
jsonb_array_elements()
函数可能有助于按数组 JSONB 列查询:
SELECT
id,
to_jsonb(array_agg(previous_company)) AS previous_companies
FROM (
SELECT
id,
jsonb_array_elements(previous_companies) AS previous_company
FROM ( VALUES
('id1', '[{"company":"Facebook", "link": "www.facebook.com"},{"company":"Google", "link": "www.google.com"}, {"company":"Some Face", "link": "www.someface.com"}]'::jsonb),
('id2', '[{"company":"Some Face", "link": "www.someface.com"}]'::jsonb),
('id3', '[{"company":"Google", "link": "www.google.com"}]'::jsonb)
) employees (id, previous_companies)
) T
WHERE
lower(previous_company->>'company') LIKE '%face%'
GROUP BY
id
;
我正在使用 Postgres 数据库,并且正在尝试使用新的 JSONB 类型。我有一个名为 employees
的 table 和一个名为 previous_companies
的列,其中包含以下 JSON 数据:
[{"company":"Facebook", "link": "www.facebook.com"}, {"company":"Google", "link": "www.google.com"}, {"company":"Some Face", "link": "www.someface.com"}]
我正在尝试 select 所有具有字段 "company" 特定字符串的员工,例如:
- 如果我想要在一家公司工作的所有员工,名字上有 "face" 我会:
[{"company":"Facebook", "link": "www.facebook.com"}, {"company":"Some Face", "link": "www.someface.com"}]
我能够查询 EXACT 字符串,如下所示:
SELECT * FROM employees WHERE previous_companies @> '[{"company":"Facebook"}]'
但它 returns 这个:[{"company":"Facebook", "link": "www.facebook.com"}]
如您所见,不支持查询不完整的字符串。
谢谢!
jsonb_array_elements()
函数可能有助于按数组 JSONB 列查询:
SELECT
id,
to_jsonb(array_agg(previous_company)) AS previous_companies
FROM (
SELECT
id,
jsonb_array_elements(previous_companies) AS previous_company
FROM ( VALUES
('id1', '[{"company":"Facebook", "link": "www.facebook.com"},{"company":"Google", "link": "www.google.com"}, {"company":"Some Face", "link": "www.someface.com"}]'::jsonb),
('id2', '[{"company":"Some Face", "link": "www.someface.com"}]'::jsonb),
('id3', '[{"company":"Google", "link": "www.google.com"}]'::jsonb)
) employees (id, previous_companies)
) T
WHERE
lower(previous_company->>'company') LIKE '%face%'
GROUP BY
id
;