为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
【操作系统】:
【CPU】:
【问题描述】*:
在函数内部使用 ->> 时提示:语法分析出错
注:将PG迁移DM,JSON_MODE参数配置为 1。
create or replace function ip_geo_2_jsonbarray
(_js jsonb)
return jsonb
as
declare _ret jsonb;
begin
select jsonb_agg(key || ':' || (value ->> 'continent_name') || (value->> 'country_name') || (value->> 'province_name') || (value->> 'city_name')) into _ret from jsonb_each(_js);
return _ret;
end;
[执行语句1]
create or replace function ip_geo_2_jsonbarray
(_js jsonb)
return jsonb
as
declare _ret jsonb;
begin
select jsonb_agg(key || ':' || (value ->> 'continent_name') || (value->> 'country_name') || (value->> 'province_name') || (value->> 'city_name')) into _ret from jsonb_each(_js);
执行失败,失败原因:
[-2007]:第7行, 第 179 列[]附近出现错误:
语法分析出错
首先需确认配置文件dm.ini参数json_mode=1,兼容pg,让->>运算符生效;其次可以使用json_build_object函数,拼接成json,效果如图
提问题的时 最好把环境写明。数据库版本、CPU、系统。
我这边测试是没问题。
数据库版本:1-4-6-2024.12.25-255012-20119-ENT Pack20
CREATE OR REPLACE FUNCTION ip_geo_2_jsonbarray(_js JSONB)
RETURNS JSONB AS $$
DECLARE
_ret JSONB;
_key TEXT;
_value JSONB;
_str TEXT;
BEGIN
_ret := '[]'::JSONB; -- 初始化一个空的JSONB数组
FOR _key, _value IN SELECT * FROM jsonb_each(_js) LOOP
-- 假设_value是一个JSONB对象,并且包含所需的字段
_str := _key || ':' ||
COALESCE(_value->>'continent_name', '') || ', ' ||
COALESCE(_value->>'country_name', '') || ', ' ||
COALESCE(_value->>'province_name', '') || ', ' ||
COALESCE(_value->>'city_name', '');
-- 去除末尾的逗号和空格
_str := rtrim(_str, ', ');
-- 将字符串转换为JSONB数组的一个元素,并添加到结果中
_ret := _ret || format('["%s"]', _str)::JSONB;
END LOOP;
-- 由于我们是在循环中逐个添加元素,所以最终的结果已经是一个完整的JSONB数组
-- 不需要再次使用jsonb_agg,因为我们已经手动构建了数组
RETURN _ret;
END;
$$ LANGUAGE plpgsql;