如何在PostgreSQL中提取指定分隔符间的目标数字子串
PostgreSQL提取指定位置数字的解决方案
场景说明
你的数据是存储在PostgreSQL中的JSON格式字符串,需要提取"statut_alpha"字段前一个键对应的数字值。
方法1:字段为文本类型(text/varchar)
利用PostgreSQL正则表达式函数直接提取目标数字:
方式A:用regexp_match精准捕获
SELECT (regexp_match(your_column, '"([^"]+)"\s*:\s*"(\d+)"\s*,"statut_alpha"'))[2] AS target_number FROM your_table;
- 正则逻辑:匹配任意键名 + 冒号 + 数字值 + 紧跟的
","statut_alpha",直接捕获数字部分 - 如需转成数值类型,可追加
::int:
SELECT (regexp_match(your_column, '"([^"]+)"\s*:\s*"(\d+)"\s*,"statut_alpha"'))[2]::int AS target_number FROM your_table;
方式B:用regexp_replace直接提取
SELECT regexp_replace(your_column, '.*:\s*"(\d+)"\s*,"statut_alpha".*', '\1') AS target_number FROM your_table;
- 逻辑:匹配整个字符串,仅保留
","statut_alpha"前的数字片段
方法2:字段为JSON/JSONB类型(更稳定)
如果字段是标准JSON/JSONB类型,优先用原生JSON函数处理,避免格式变动导致的错误:
SELECT your_column ->> ( SELECT key FROM jsonb_object_keys(your_column::jsonb) WHERE key NOT IN ('code_partenaire', 'statut_alpha') ) AS target_number FROM your_table;
- 逻辑:先筛选出除
code_partenaire和statut_alpha外的目标键,再提取对应的值 - 转数值类型可追加
::int:
SELECT (your_column ->> ( SELECT key FROM jsonb_object_keys(your_column::jsonb) WHERE key NOT IN ('code_partenaire', 'statut_alpha') ))::int AS target_number FROM your_table;
测试结果
用你提供的示例数据验证,两种方法均可得到预期输出:
- 1
- 1782
- 17
内容的提问来源于stack exchange,提问作者Madmaxoo
相关产品推荐
相关产品推荐

