超碰人人人人人,亚洲AV午夜福利精品一区二区,亚洲欧美综合区丁香五月1区,日韩欧美亚洲系列

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

PostgreSQL JSON 提取全攻略!復(fù)雜結(jié)構(gòu)輕松解析

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

你知道如何從 JSON 數(shù)組中提取元素嗎?如何從 JSON 對(duì)象中提取一個(gè)鍵的值?

從 JSON 數(shù)組中提取元素

要提取一個(gè) JSON 數(shù)組中的元素,作為一個(gè)JSONB的值,請使用->運(yùn)算符。

下面是使用->運(yùn)算符的語法:

json_array -> n

在此語法中,n用來定位 JSON 數(shù)組中的第 n 個(gè)元素。n 可以是正數(shù)或負(fù)數(shù)。如果 n 為負(fù)數(shù),則運(yùn)算符->返回?cái)?shù)組末尾的元素。

請注意,第一個(gè)元素的索引號(hào)為零,最后一個(gè)元素的索引號(hào)為 -1。

如果第 n 個(gè)元素不存在,則運(yùn)算符->返回null。要將數(shù)組元素提取為文本字符串,可以使用->>運(yùn)算符:

json_array ->> n

提取 JSON 數(shù)組元素的示例

讓我們來探討一些使用運(yùn)算符->->>的例子。

1) 設(shè)置一個(gè)示例表

首先,創(chuàng)建一個(gè)新表,名為employees,用來存儲(chǔ)員工數(shù)據(jù):

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) 提取第一個(gè)數(shù)組元素的示例

下面的示例使用 -> 運(yùn)算符,來檢索名為 John Doe 的員工的第一個(gè)電話號(hào)碼:

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

輸出:

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

在這個(gè)例子中,我們以索引號(hào) 0 使用->運(yùn)算符。因此,表達(dá)式phones -> 0,以一個(gè)JSONB的值返回phones數(shù)組中第一個(gè)元素。

要將第一個(gè)電話號(hào)碼提取為文本字符串,可以使用 ->> 運(yùn)算符:

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

輸出:

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

3) 提取最后一個(gè)數(shù)組元素的示例

以下示例使用->運(yùn)算符,檢索名為Jane Smith的員工的最后一個(gè)電話號(hào)碼:

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

輸出:

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

要以一個(gè)JSONB的值來提取最后一個(gè)電話號(hào)碼,可以使用 ->> 運(yùn)算符:

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

輸出:

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

4) 提取一個(gè)不存在的元素

下面的示例使用->運(yùn)算符,檢索名為Jane Smith的員工的第 4 個(gè)電話號(hào)碼:

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

輸出:

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

由于 Jane Smith 只有 3 個(gè)電話號(hào)碼,因此查詢返回NULL。

提取對(duì)象值

要通過鍵提取一個(gè) JSON 對(duì)象中的一個(gè)值,可以使用 -> 運(yùn)算符:

object -> 'key'

-> 運(yùn)算符將 ‘key’ 的值以一個(gè) JSONB 值返回。如果該鍵不存在,則 -> 運(yùn)算符返回 null。

如果要將值以一個(gè) SQL 值返回,則可以使用 ->> 運(yùn)算符:

object ->> 'key'

提取 JSON 對(duì)象值的示例

1) 設(shè)置一個(gè)示例表

首先,創(chuàng)建一個(gè)新表,名為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) 從一個(gè) JSON 對(duì)象中提取值

下面的示例使用->運(yùn)算符,提取員工號(hào)為 1 的請求的當(dāng)前職位:

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

輸出:

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

返回值是一個(gè) JSONB 值。

要將當(dāng)前職位以一個(gè)文本字符串返回,可以使用->>運(yùn)算符:

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

輸出:

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

3) 提取一個(gè)不存在的鍵

下面的示例嘗試從 JSON 對(duì)象中提取一個(gè)不存在的鍵的值:

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

輸出:

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

概括

  • ? 使用json_array -> njson_array ->> n運(yùn)算符,指定一個(gè)索引號(hào),將 JSON 數(shù)組元素提取為一個(gè)JSONB的值或文本字符串。
  • ? 使用json_object -> 'key'json_object ->> 'key'運(yùn)算符,指定一個(gè)鍵,從一個(gè)對(duì)象中提取一個(gè) JSONB 的值或文本字符串。

?

閱讀原文:https://mp.weixin.qq.com/s/AcVZ6V0cGuq-egb7xLFzVA


該文章在 2025/5/6 10:52:29 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved