五月 6, 2025
摘要:在本教程中,您将学习如何使用运算符->
和->>
,从 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(255) NOT 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 -> n
和json_array ->> n
运算符,指定一个索引号,将 JSON 数组元素提取为一个JSONB
的值或文本字符串。 - 使用
json_object -> 'key'
和json_object ->> 'key'
运算符,指定一个键,从一个对象中提取一个 JSONB 的值或文本字符串。