Percebi uma diferença na avaliação de uma expressão de caminho SQL/JSON entre Oracle e Postgres e me pergunto qual está correta.
Considere a seguinte estrutura JSON:
{
"key1": {"id":1000, "price": 42},
"key2": {"id":2000, "price": 3.14},
"key3": {"id":3000, "price": 2.7}
}
Para obter o preço do produto com ID = 1000, o Postgres me permite usar a seguinte expressão de caminho JSON:
jsonb_path_query(doc, '$.* ? (@.id == 1000).price')
No entanto, ao usar o Oracle json_value()
(ou json_query()
- não importa)
json_value(doc, '$.* ? (@.id == 1000).price')
Eu recebo o seguinte erro (usando Oracle 18c):
ORA-40597: JSON path expression syntax error ('$.* ? (@.id == 1000).price') JZN-00209: Unexpected characters after end of path at position 21
Há uma solução alternativa no Oracle 18c:
json_value(json_query(doc, '$.* ? (@.id == 1000)'), '$.price')
Então minha pergunta é:
O padrão SQL permite o acesso à propriedade como feito na implementação do Postgres?
Ou isso simplesmente não está especificado no padrão e marcado como "dependente da implementação"?
(Dado o histórico do Postgres em manter o padrão o máximo possível, suspeito que o Postgres esteja correto e a Oracle não esteja implementando o padrão completo)
Eu não sei sobre o padrão, mas funciona muito bem em 19c.
Roteiro:
18c (18.10):
19c (19,7):