【发布时间】:2017-09-14 17:55:44
【问题描述】:
我的表有很多行,每行包含一个 jsonb 对象。
此对象包含一个数组,其中可能有多个同名但具有不同值的键。
我的目标是扫描我的整个表并验证在这个 json 对象的数组中哪些行包含重复值。
第 1 行示例数据:
{
"Name": "Bobb Smith",
"Identifiers": [
{
"Content": "123",
"RecordID": "123",
"SystemID": "Test",
"LastUpdated": "2017-09-12T02:23:30.817Z"
},
{
"Content": "abc",
"RecordID": "abc",
"SystemID": "Test",
"LastUpdated": "2017-09-13T10:10:21.598Z"
},
{
"Content": "def",
"RecordID": "def",
"SystemID": "Test",
"LastUpdated": "2017-09-13T10:10:21.598Z"
}
]
}
第 2 行示例数据:
{
"Name": "Bob Smith",
"Identifiers": [
{
"Content": "abc",
"RecordID": "abc",
"SystemID": "Test",
"LastUpdated": "2017-09-13T10:10:26.020Z"
}
]
}
我当前的查询最初用于根据名称值查找重复项,但是,在名称可能被混淆的情况下,使用记录 ID 是一种更完整的证明方法。
但是,我无法弄清楚如何从本质上对每一行中的每个“记录 ID”进行迭代,并将该“记录 ID”与同一表中每一行中的每个其他“记录 ID”进行比较以查找匹配项。
我当前的查询匹配“姓名”:
discard temporary;
with dupe as (
select
json_document->>'Name' as name,
json_document->'Identifiers'->0->'RecordID' as record_id,
from staging
)
select name as "Name", record_id::text as "Record ID"
from dupe da
where ( select count(*) from dupe db where db.name = da.name) > 1
order by full_name;
如果两行中的“姓名”字段包含相同的“鲍勃”拼写,上述查询将返回匹配的行。
我需要使用“RecordID”字段的嵌套值来实现相同的功能。
这里的问题是
json_document->'Identifiers'->0->'RecordID'
仅返回数组内索引 0 处的“RecordID”。
例如,这不起作用:
discard temporary;
with dupe as (
select
json_document->>'Name' as name,
json_document->'Identifiers'->0->'RecordID' as record_id,
from staging
)
select name as "Name", record_id::text as "Record ID"
from dupe da
where ( select count(*) from dupe db where db.record_id = da.record_id) > 1
order by full_name;
...因为查询只检查 'Identifiers' 数组的索引 0 处的 'RecordID' 值。
我怎么能从本质上执行类似的操作
SELECT json_document@>'RecordID'
为了让我的查询检查 'Identifiers' 数组中的每个索引是否有 'RecordID' 值?
非常感谢任何和所有帮助!谢谢!
- 我希望仅通过 Postgres 查询而不是通过使用外部语言访问此数据来完成此操作。 (Python 等)
【问题讨论】:
标签: json postgresql