Postgres - 如何从一个字段中获取它在数组中的每个 json 上重复的所有值?

Fea*_*Doe 5 postgresql json

我正在以 jsonb 格式在 PostgreSQL 9.5 上的某些网站上存储大量 json。其中一个字段是一组具有相同信息的 Json。这是一个例子。

[
  {
    "text": "JIMIN",
    "indices": [
      16,
      22
    ]
  },
  {
    "text": "PUMA",
    "indices": [
      23,
      28
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

我想检索所有text值,也就是说,我想进行一个查询,在这个例子中给我JIMINPUMA。我找不到使用公共运算符(如#>>)来实现这一目标的方法。有没有办法做到这一点?

pie*_*rop 6

您没有提供任何代码,因此我将创建一个包含一行和一些查询的示例表,以提取您需要的信息。

CREATE TABLE test (myfield jsonb);
Run Code Online (Sandbox Code Playgroud)

加载数据:

INSERT INTO test (myfield) VALUES ('
[
  {
    "text": "JIMIN",
    "indices": [
      16,
      22
    ]
  },
  {
    "text": "PUMA",
    "indices": [
      23,
      28
    ]
  }
]
'::jsonb);
Run Code Online (Sandbox Code Playgroud)

要提取特定项,假设text第二个数组项的字段:

SELECT myfield#>>'{1,text}' AS text FROM test;
Run Code Online (Sandbox Code Playgroud)

这将输出:

  text 
 ------
  PUMA
 (1 row)
Run Code Online (Sandbox Code Playgroud)

为了提取text数组内的所有字段,一个可能的解决方案是:

SELECT (jsonb_array_elements(myfield)::jsonb)->'text' AS text FROM test;
Run Code Online (Sandbox Code Playgroud)

输出是:

  text   
---------
 "JIMIN"
 "PUMA"
(2 rows)
Run Code Online (Sandbox Code Playgroud)

显然这适用于许多记录:每个数组项将被移植到每个数组的一行。此查询与 PostgreSQL 9.5 兼容。查看官方文档以创建更高效​​或更通用的查询(https://www.postgresql.org/docs/9.5/static/functions-json.html)。