You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL中遍历含数组的JSON字典并获取无引号元素

PostgreSQL遍历JSON数组字典获取无引号元素的解决方案

问题背景

尝试编写PostgreSQL函数遍历包含数组的JSON字典,输入JSON示例:'{"Key1": ["value1", "value2", "value3"],"key2":["value4","value5"]}',目标是获取不带引号的文本格式数组元素用于后续处理,但执行原函数时触发格式错误。

原函数输入

datajson json: '{"Key1": ["value1", "value2", "value3", "value4"],"Default":["value5","value6"]}';

原函数代码

$BODY$
DECLARE
    keys text[];
    key text;
    value text;
    element text;

BEGIN
    for key in select json_object_keys(datajson) loop
        raise notice '%', key;
        for value in (select json_array_elements(datajson->key) )
        loop
            raise notice '%', value;
        end loop;
    end loop;
end;

$BODY$ language plpgsql

报错信息

NOTICE:   key1
NOTICE:   "value1"
ERROR:  Got exception:
state  : 22P02
message: malformed array literal: ""value1""
detail : Array value must start with "{" or dimension information.

错误原因

json_array_elements(datajson->key)返回的是JSON类型值,直接赋值给text类型变量时,PostgreSQL会尝试将带双引号的JSON字符串解析为数组,导致格式不匹配触发错误。需要明确将JSON值转换为无引号的纯文本。

修改方案

方案1:使用json_array_elements_text直接提取文本元素

该函数专门用于从JSON数组中提取文本类型的元素,自动去除引号:

$BODY$
DECLARE
    key text;
    element text;
BEGIN
    FOR key IN SELECT json_object_keys(datajson) LOOP
        RAISE NOTICE '当前键: %', key;
        FOR element IN SELECT json_array_elements_text(datajson->key) LOOP
            RAISE NOTICE '元素值: %', element;
        END LOOP;
    END LOOP;
END;
$BODY$ language plpgsql

方案2:对JSON类型结果做强制类型转换

如果需要保留json_array_elements,可以将其返回的JSON值强制转为text类型,自动去除引号:

$BODY$
DECLARE
    key text;
    element text;
BEGIN
    FOR key IN SELECT json_object_keys(datajson) LOOP
        RAISE NOTICE '当前键: %', key;
        FOR element IN SELECT json_array_elements(datajson->key)::text LOOP
            RAISE NOTICE '元素值: %', element;
        END LOOP;
    END LOOP;
END;
$BODY$ language plpgsql

执行效果

修改后的函数执行后,会输出不带双引号的纯文本元素,例如:

NOTICE:  当前键: Key1
NOTICE:  元素值: value1
NOTICE:  元素值: value2
NOTICE:  元素值: value3
NOTICE:  元素值: value4
NOTICE:  当前键: Default
NOTICE:  元素值: value5
NOTICE:  元素值: value6

内容的提问来源于stack exchange,提问作者anonymous_101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:12:38