我注意到 Oracle 和 Postgres 对 SQL/JSON 路径表达式的评估存在差异,我想知道哪个是正确的。
考虑以下 JSON 结构:
{
"key1": {"id":1000, "price": 42},
"key2": {"id":2000, "price": 3.14},
"key3": {"id":3000, "price": 2.7}
}
要获取 ID = 1000 的产品价格,Postgres 允许我使用以下 JSON 路径表达式:
jsonb_path_query(doc, '$.* ? (@.id == 1000).price')
但是,当使用 Oracle 的json_value()
(或json_query()
- 没关系)
json_value(doc, '$.* ? (@.id == 1000).price')
我收到以下错误(使用 Oracle 18c):
ORA-40597: JSON path expression syntax error ('$.* ? (@.id == 1000).price') JZN-00209: Unexpected characters after end of path at position 21
Oracle 18c 中有解决方法:
json_value(json_query(doc, '$.* ? (@.id == 1000)'), '$.price')
所以我的问题是:
SQL 标准是否允许在 Postgres 的实现中进行属性访问?
或者这根本没有在标准中指定并标记为“依赖于实现”?
(鉴于 Postgres 尽可能坚持标准的记录,我怀疑 Postgres 是正确的,而 Oracle 没有实施完整的标准)
我不知道标准,但它在 19c 中工作得很好。
脚本:
18c (18.10):
19c (19.7):