溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

遞歸查詢與PostgreSQL的JSON數(shù)據(jù)類型

發(fā)布時(shí)間:2024-09-07 16:57:42 來(lái)源:億速云 閱讀:83 作者:小樊 欄目:關(guān)系型數(shù)據(jù)庫(kù)

遞歸查詢是一種在數(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)整。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI