您好,登錄后才能下訂單哦!
遞歸查詢是一種在數(shù)據(jù)庫(kù)中查詢具有層次結(jié)構(gòu)或嵌套關(guān)系的數(shù)據(jù)的方法
在PostgreSQL中,可以使用遞歸公共表表達(dá)式(Recursive Common Table Expressions,簡(jiǎn)稱CTE)實(shí)現(xiàn)遞歸查詢。假設(shè)我們有一個(gè)包含JSON數(shù)據(jù)的表,如下所示:
CREATE TABLE json_data (
id SERIAL PRIMARY KEY,
data JSONB
);
其中,data
列包含JSON數(shù)據(jù)?,F(xiàn)在,假設(shè)我們要查詢這個(gè)表中的JSON數(shù)據(jù),并展開(kāi)嵌套的對(duì)象和數(shù)組??梢允褂靡韵逻f歸查詢實(shí)現(xiàn):
WITH RECURSIVE json_tree AS (
SELECT
id,
data,
'{}'::text[] AS path,
data #>> '{}' AS value
FROM
json_data
WHERE
id = 1
UNION ALL
SELECT
jt.id,
jt.data,
CASE
WHEN jsonb_typeof(elem) = 'object' THEN path || key
ELSE path
END,
CASE
WHEN jsonb_typeof(elem) = 'object' THEN elem #>> '{}'
ELSE elem #>> '{}'
END
FROM
json_tree jt,
LATERAL jsonb_each(jt.data) e(key, elem)
WHERE
jsonb_typeof(jt.data) = 'object'
UNION ALL
SELECT
jt.id,
jt.data,
path || (idx - 1)::text,
elem #>> '{}'
FROM
json_tree jt,
LATERAL jsonb_array_elements(jt.data) WITH ORDINALITY a(elem, idx)
WHERE
jsonb_typeof(jt.data) = 'array'
)
SELECT
id,
path,
value
FROM
json_tree;
這個(gè)查詢首先從json_data
表中選擇一個(gè)具有特定ID的JSON數(shù)據(jù)。然后,它使用遞歸CTE來(lái)展開(kāi)JSON數(shù)據(jù)的層次結(jié)構(gòu)。遞歸查詢分為兩部分:一部分處理對(duì)象,另一部分處理數(shù)組。最后,查詢返回每個(gè)JSON元素的路徑和值。
注意:這個(gè)查詢僅適用于PostgreSQL 9.4及更高版本,因?yàn)樗褂昧?code>jsonb數(shù)據(jù)類型和相關(guān)的函數(shù)。如果你使用的是較舊的PostgreSQL版本,可能需要進(jìn)行一些調(diào)整。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。