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

PostgreSQL:如何检查jsonb列任意键含指定值?值转数组方法

PostgreSQL jsonb列判断任意键值是否包含特定值的方法

1. 将jsonb所有值转为数组的方法

要提取jsonb列的所有值并转为数组,可使用jsonb_each_text函数配合array()构造器,它会把每个键值对的value以文本形式提取后组合成数组:

array(select value from jsonb_each_text(srvc_req.form_data))

如果需要保留jsonb原生类型的值(而非强制转文本),可以用jsonb_values函数,再按需转换类型:

array(select value::text from jsonb_values(srvc_req.form_data))

2. 修正你的PL/pgSQL代码片段

你原代码中srvc_req.form_data->>[how to check all keys here]的部分,可替换为上述数组表达式。另外推荐用format函数拼接SQL,比直接用quote_literal更简洁,还能避免SQL注入风险:

if json_array_length(tms_hlpr_usr_has_authority_fr_srvc_requests(usr_id_,org_id_)) > 0 then
    _extra_where = _extra_where || format(
        ' and %L = any(array(select value from jsonb_each_text(srvc_req.form_data))) and srvc_req.is_deleted is not true ',
        usr_id_
    );
end if;

3. 更高效的替代方案(无需转数组)

转数组需要提取所有值再做匹配,而直接用exists子查询,只要找到第一个匹配的键值就会停止计算,性能更优,尤其适合处理大体积jsonb数据:

if json_array_length(tms_hlpr_usr_has_authority_fr_srvc_requests(usr_id_,org_id_)) > 0 then
    _extra_where = _extra_where || format(
        ' and exists (select 1 from jsonb_each_text(srvc_req.form_data) where value = %L) and srvc_req.is_deleted is not true ',
        usr_id_
    );
end if;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:35:20