如何检查json路径/值条目是否存在于一个巨大的json对象在oracle sql?



假设json对象是:

{
"title":"<title goes here>",
"version":"1.0.0",
"name":"<name goes here>",
"features": {
"feature-id1":{
"id":"090ccd9c-8930-4aa9-9aa3-f9c8e6747a27",
"name":"feature1",
"version":"1.0.0"
}
"feature-id2":{
"id":"932twe8e-2184-4er9-5qw3-g4e9w9821w71",
"name":"feature2",
"version":"1.0.0"
}
...
}     
}

我想检查在上述json数据中是否存在json路径/值条目(或)嵌套json对象。
我已经尝试了
json_exists(json_column,'$.features?(@."feature-id1" == "{"id": "090ccd9c-8930-4aa9-9aa3-f9c8e6747a27","name":"feature1","version":"1.0.0"}")');
,但这给了我一个错误">JZN-00229:在括号表达式中缺少括号"。我们不能使用json_exists()来检查json对象/数组的值?
在Postgresql,这可以通过使用"@>"操作符:
json_data->'features'->'feature-id1' @> 'provide the json value'
有办法在Oracle SQL实现相同的吗?我使用Oracle 19c的最新补丁(19.15)。

至少在Oracle中(我不知道其他数据库产品-你提到Postgre并说它有Oracle没有的功能),比较过滤器像你试图只适用于标量值,而不是嵌套对象。

如果我明白你想做什么,那么在Oracle中你会用类似

这样的东西来做。
json_exists(json_column,'$."features"."feature-id1"?(
@."id"      == "090ccd9c-8930-4aa9-9aa3-f9c8e6747a27"
&& @."name"    == "feature1"
&& @."version" == "1.0.0"
)'
)

,尽管这并不完全等同于您要做的。也就是说,这个过滤器只确保一个键"feature-id1"的存在。一个嵌套对象,至少有三个关键字:"id"、"姓名";和"version",使用规定的值-但是它可以也有其他键。所以feature-id1的对象值不等于在您的尝试中指定的对象,其中恰好具有三把钥匙,不能再多了。这对你有用吗?只有你自己知道。

相关内容

  • 没有找到相关文章

最新更新