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

如何在PostgreSQL中解析分号分隔的key:value键值对字符串

PostgreSQL 分号分隔key:value字符串解析实现方案

核心思路

先将原始字符串按分号拆分得到单个key:value项,再按冒号拆分每项得到独立的键、值,可根据使用场景选择组装为键值映射结构或直接提取指定key的结果。


方法1:解析为hstore键值对(适合全量键值查询场景)

需要先开启hstore扩展,解析后可以直接通过key快速查询对应值:

  1. 开启hstore扩展(仅需执行一次)
CREATE EXTENSION IF NOT EXISTS hstore;
  1. 解析示例
SELECT 
  kv_map -> 'ref' AS ref_value,
  kv_map -> 'code' AS code_value
FROM (
  -- 组装键值对为hstore类型
  SELECT hstore(array_agg(split_part(kv_item, ':', 1)), array_agg(split_part(kv_item, ':', 2))) AS kv_map
  FROM (
    -- 按分号拆分字符串为单个key:value行
    SELECT unnest(string_to_array('ref:12345;code:ab', ';')) AS kv_item
  ) split_items
) parse_result;

方法2:无扩展直接提取指定key(适合少量key提取场景)

如果只需要提取个别key的值,无需开启额外扩展,直接用正则匹配即可:

-- 提取code对应的值
SELECT regexp_match('ref:12345;code:ab', 'code:([^;]+)')::text[] ->> 0 AS code_value;

-- 提取ref对应的值
SELECT regexp_match('ref:12345;code:ab', 'ref:([^;]+)')::text[] ->> 0 AS ref_value;

批量处理表数据示例

如果需要处理整张表的kv字段,假设表名为business_data,包含id、kv_str两个字段:

SELECT 
  id,
  regexp_match(kv_str, 'ref:([^;]+)')::text[] ->> 0 AS ref,
  regexp_match(kv_str, 'code:([^;]+)')::text[] ->> 0 AS code
FROM business_data;

注意事项

  • 正则匹配方式适合格式严格、key不会在value中重复出现的场景,如果格式复杂建议优先使用方法1的拆分逻辑
  • 如果键值对存在分号、冒号的转义场景,需要先处理转义字符再执行拆分或匹配操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:57:03