查找JSON中的某个对象



我试图查询是否存在嵌套JSON结构中的特定列。有办法做到这一点吗?例如,在相同的JSON中,我有一些包含"favoriteNumber"在"Friends"还有一些没有。

例如,以下是不同的情况:

{   "name": "Kyle",
"favoriteNumber":3
"isProgrammer":3,
"hobbies":["weight Lifting","Bowling"],
"friends":[{
"name":"Joey",
"favoriteNumber":100,
"isProgrammer":false,
"friends"[...]
}]
}

在某些情况下没有"favoriteNumber"在"Friends">

{   "name": "Travis",
"favoriteNumber":3
"isProgrammer":3,
"hobbies":["Scuba Diving","Bowling"],
"friends":[{
"name":"Monica",
"isProgrammer":false,
"friends"[...]
}]
}

我要找到所有包含"favoriteNumber"在"friends"所以在上面的例子中,只有第一个应该显示。我该怎么做呢?所以我要看一个特定的对象是否存在。

如果您每行有一个JSON对象,并且您想知道是否有任何朋友有一个喜欢的号码。我们假设name在数据中是不同的(所以Kyle有三个朋友,其中两个有喜欢的号码,我们只有一个,那么这应该是可行的:

SELECT DISTINCT j.value:name::text as name, j.value as json
FROM data_table t,
LATERAL FLATTEN(input=>t.json) j,
LATERAL FLATTEN(input=>j.value:friends) f
WHERE IS_INTEGER(f.value:favoriteNumber);

上面的代码将展开行json中的所有人(如果它是一个数组),所以在你的例子中,顶层json不是一个数组,jflatten可以像这样跳过:

SELECT DISTINCT t.json:name::text as name, t.json as json
FROM data_table t,
LATERAL FLATTEN(input=>t.json:friends) f,
WHERE IS_INTEGER(f.value:favoriteNumber);