从 postgres table 中获取行,其中包含 jsonb[] 列中的特定 id
Fetch rows from postgres table which contains a specific id in jsonb[] column
我有一个详细信息 table,其中 adeet 列定义为 jsonb[]
adeet 列中存储的示例值如下图
数据库中存储的示例数据:
我想要 return 满足 id=26088
的行,即行 1
和 3
我已经尝试了数组操作和 json 操作,但它没有按要求工作。任何指针
显然 adeet
列的类型不是 JSON
/JSONB
类型,但可能是 VARCHAR
类型,我们应该修复格式以便转换为JSONB
类型。我使用 replace()
和 r
/ltrim()
函数进行此转换,并且更喜欢派生数组以便使用 jsonb_array_elements()
函数:
WITH t(jobid,adeet) AS
(
SELECT jobid, replace(replace(replace(adeet,'\',''),'"{','{'),'}"','}')
FROM tab
), t2 AS
(
SELECT jobid, ('['||rtrim(ltrim(adeet,'{'), '}')||']')::jsonb as adeet
FROM t
)
SELECT t.*
FROM t2 t
CROSS JOIN jsonb_array_elements(adeet) j
WHERE (j.value ->> 'id')::int = 26088
您想将 JSONB 的 <@
运算符与泛型数组 ANY 构造结合起来。
select * from foobar where '{"id":26088}' <@ ANY (adeet);
我有一个详细信息 table,其中 adeet 列定义为 jsonb[]
adeet 列中存储的示例值如下图
数据库中存储的示例数据:
我想要 return 满足 id=26088
的行,即行 1
和 3
我已经尝试了数组操作和 json 操作,但它没有按要求工作。任何指针
显然 adeet
列的类型不是 JSON
/JSONB
类型,但可能是 VARCHAR
类型,我们应该修复格式以便转换为JSONB
类型。我使用 replace()
和 r
/ltrim()
函数进行此转换,并且更喜欢派生数组以便使用 jsonb_array_elements()
函数:
WITH t(jobid,adeet) AS
(
SELECT jobid, replace(replace(replace(adeet,'\',''),'"{','{'),'}"','}')
FROM tab
), t2 AS
(
SELECT jobid, ('['||rtrim(ltrim(adeet,'{'), '}')||']')::jsonb as adeet
FROM t
)
SELECT t.*
FROM t2 t
CROSS JOIN jsonb_array_elements(adeet) j
WHERE (j.value ->> 'id')::int = 26088
您想将 JSONB 的 <@
运算符与泛型数组 ANY 构造结合起来。
select * from foobar where '{"id":26088}' <@ ANY (adeet);