无法从存储在 postgresql 数据库中的 JSON 选择文本或数字

Trouble selecting text or numbers from a JSON stored in a postgresql DB

这是我之前提出的这个问题的后续:

我有一个 table 数据类型为 JSONB 的列。该列中的每一行都有一个 JSON,看起来像这样:

[
   {"A": {"AA": "something", "AB": false}},
   {"B": {"BA":[{"BAAA": [1,2,3,4]},{"BABA": {"one": 42}}]}}
]

注:JSON是一团乱七八糟的列表和对象,一共300行。不是我的数据,但我坚持使用它。 :(

我正在使用 postgresql 版本 12

我正在尝试编写查询 return AA (A->AA) 的值。这是我试过的查询:

select data @@ '$[*].A.AA' from test

只是 return 为空。

但是当我 运行 这个查询时:

select data @@ '$[*].A.AB' from test

正确 return错误。

问题:

一些要玩的示例数据:https://dbfiddle.uk/?rdbms=postgres_12&fiddle=fec0ba6e9bd6dffb9874e20ef7abab1d

您误解了 @@ 的作用。它检查 JSONPath 表达式是否为真。它不 return 该路径的值。

'$[*].A.AB' 这样的路径表达式对于 @@ 运算符没有真正意义,因为它不包含任何条件运算符,例如 ==<> 可以评估。

'$[*].A.AB' 恰好有效,因为该路径的值是布尔值。如果那是例如一个整数,它也会 return null

如果要通过JSON路径函数取值,需要使用jsonb_path_query_first()

select jsonb_path_query_first(data, '$[*].A.AB') 
from test

请注意,结果再次是 JSONB 值,而不是 text 值。如果你想要它作为 text 使用 jsonb_path_query_first(data, '$[*].A.AB') #>> '{}

dbFiddle


如果有像 #> 这样的运算符接受 JSONPath 来提取该路径的值,那确实很好,但目前我们不得不忍受笨拙的 jsonb_path_query_first()