LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

PostgreSQL JSON 提取全攻略!复杂结构轻松解析

admin
2025年5月6日 9:10 本文热度 74

你知道如何从 JSON 数组中提取元素吗?如何从 JSON 对象中提取一个键的值?

从 JSON 数组中提取元素

要提取一个 JSON 数组中的元素,作为一个JSONB的值,请使用->运算符。

下面是使用->运算符的语法:

json_array -> n

在此语法中,n用来定位 JSON 数组中的第 n 个元素。n 可以是正数或负数。如果 n 为负数,则运算符->返回数组末尾的元素。

请注意,第一个元素的索引号为零,最后一个元素的索引号为 -1。

如果第 n 个元素不存在,则运算符->返回null。要将数组元素提取为文本字符串,可以使用->>运算符:

json_array ->> n

提取 JSON 数组元素的示例

让我们来探讨一些使用运算符->->>的例子。

1) 设置一个示例表

首先,创建一个新表,名为employees,用来存储员工数据:

CREATE TABLE employees(
   id SERIAL PRIMARY KEY,
   name VARCHAR(255NOT NULL,
   phones JSONB NOT NULL
);

第二步,插入一些行employees表中:

INSERT INTO employees (name, phones)
VALUES
   ('John Doe''["(408) 555-1111", "(408) 555-2222", "(408) 555-3333"]'),
   ('Jane Smith''["(408) 666-1111", "(408) 666-2222", "(408) 666-3333"]')
RETURNING *;

输出:

 id |    name    |                         phones
----+------------+--------------------------------------------------------
  1 | John Doe   | ["(408) 555-1111", "(408) 555-2222", "(408) 555-3333"]
  2 | Jane Smith | ["(408) 666-1111", "(408) 666-2222", "(408) 666-3333"]
(2 rows)

2) 提取第一个数组元素的示例

下面的示例使用 -> 运算符,来检索名为 John Doe 的员工的第一个电话号码:

SELECT
  name,
  phones -> 0 phone
FROM
  employees
WHERE
  name = 'John Doe';

输出:

   name   |      phone
----------+------------------
 John Doe | "(408) 555-1111"
(1 row)

在这个例子中,我们以索引号 0 使用->运算符。因此,表达式phones -> 0,以一个JSONB的值返回phones数组中第一个元素。

要将第一个电话号码提取为文本字符串,可以使用 ->> 运算符:

SELECT
  name,
  phones ->> 0 phone
FROM
  employees
WHERE
  name = 'John Doe';

输出:

   name   |     phone
----------+----------------
 John Doe | (408) 555-1111
(1 row)

3) 提取最后一个数组元素的示例

以下示例使用->运算符,检索名为Jane Smith的员工的最后一个电话号码:

SELECT
  name,
  phones -> -1 phone
FROM
  employees
WHERE
  name = 'Jane Smith';

输出:

    name    |      phone
------------+------------------
 Jane Smith | "(408) 666-3333"
(1 row)

要以一个JSONB的值来提取最后一个电话号码,可以使用 ->> 运算符:

SELECT
  name,
  phones ->> -1 phone
FROM
  employees
WHERE
  name = 'Jane Smith';

输出:

    name    |     phone
------------+----------------
 Jane Smith | (408) 666-3333
(1 row)

4) 提取一个不存在的元素

下面的示例使用->运算符,检索名为Jane Smith的员工的第 4 个电话号码:

SELECT
  name,
  phones -> 3 phone
FROM
  employees
WHERE
  name = 'Jane Smith';

输出:

    name    | phone
------------+-------
 Jane Smith | null
(1 row)

由于 Jane Smith 只有 3 个电话号码,因此查询返回NULL

提取对象值

要通过键提取一个 JSON 对象中的一个值,可以使用 -> 运算符:

object -> 'key'

-> 运算符将 ‘key’ 的值以一个 JSONB 值返回。如果该键不存在,则 -> 运算符返回 null。

如果要将值以一个 SQL 值返回,则可以使用 ->> 运算符:

object ->> 'key'

提取 JSON 对象值的示例

1) 设置一个示例表

首先,创建一个新表,名为requests

CREATE TABLE requests(
   id SERIAL PRIMARY KEY,
   employee_id INT NOT NULL,
   request_date DATE NOT NULL,
   data JSONB NOT NULL
);

第二步,向requests表中插入一些行:

INSERT INTO requests (request_date, employee_id, data)
VALUES
   ('2024-02-23',1'{"current_position": "Software Engineer", "new_position": "Senior Software Engineer", "effective_date": "2024-03-01"}'),
   ('2024-02-24',2'{"current_position": "Data Analyst", "new_position": "Senior Data Analyst", "effective_date": "2024-03-15"}'),
   ('2024-02-25',3'{"current_position": "Marketing Manager", "new_position": "Senior Marketing Manager", "effective_date": "2024-04-01"}')
RETURNING *;

输出:

 id | employee_id | request_date |                                                         data
----+-------------+--------------+-----------------------------------------------------------------------------------------------------------------------
  1 |           1 | 2024-02-23   | {"new_position": "Senior Software Engineer", "effective_date": "2024-03-01", "current_position": "Software Engineer"}
  2 |           2 | 2024-02-24   | {"new_position": "Senior Data Analyst", "effective_date": "2024-03-15", "current_position": "Data Analyst"}
  3 |           3 | 2024-02-25   | {"new_position": "Senior Marketing Manager", "effective_date": "2024-04-01", "current_position": "Marketing Manager"}
(3 rows)

2) 从一个 JSON 对象中提取值

下面的示例使用->运算符,提取员工号为 1 的请求的当前职位:

SELECT
  data -> 'current_position' current_position
FROM
  requests
WHERE
  employee_id = 1;

输出:

  current_position
---------------------
 "Software Engineer"
(1 row)

返回值是一个 JSONB 值。

要将当前职位以一个文本字符串返回,可以使用->>运算符:

SELECT
  data ->> 'current_position' current_position
FROM
  requests
WHERE
  employee_id = 1;

输出:

 current_position
-------------------
 Software Engineer
(1 row)

3) 提取一个不存在的键

下面的示例尝试从 JSON 对象中提取一个不存在的键的值:

SELECT
  data ->> 'position' position
FROM
  requests
WHERE
  employee_id = 1;

输出:

 position
----------
 null
(1 row)

概括

  • • 使用json_array -> njson_array ->> n运算符,指定一个索引号,将 JSON 数组元素提取为一个JSONB的值或文本字符串。
  • • 使用json_object -> 'key'json_object ->> 'key'运算符,指定一个键,从一个对象中提取一个 JSONB 的值或文本字符串。


阅读原文:https://mp.weixin.qq.com/s/AcVZ6V0cGuq-egb7xLFzVA


该文章在 2025/5/6 10:52:29 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved