LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

PostgreSQL JSON 提取全攻略!復雜結構輕松解析

admin
2025年5月6日 9:10 本文熱度 223

你知道如何從 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

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
欧美亚洲国产aⅴ人妖 | 亚洲欧美国产97综合首页 | 亚洲成综合人在线播放 | 亚洲国产日韩在线人高清 | 欧美日韩成人一区精品高免费专区 | 在线激情小视频第一页 |