PostgreSQL中从marc表tag字段提取指定子串的技术求助
解决方案
针对你的需求,我们可以通过正则表达式精准提取|a和|d对应的内容并拼接,以下是适配常见数据库的实现方式:
核心思路
- 定位
|a后到|d前的文本片段,去除末尾多余空格 - 定位
|d后到下一个|前的文本片段 - 将两个片段直接拼接得到目标格式
PostgreSQL 实现
SELECT TRIM(TRAILING ' ' FROM REGEXP_MATCH(tag, '^"\\|a (.*?)\\|d')[1]) || REGEXP_MATCH(tag, '\\|d (.*?)\\|')[1] AS result FROM marc WHERE id = '10825700016';
或者用更简洁的单次正则匹配拼接:
SELECT REGEXP_REPLACE(tag, '^"\\|a (.*?)\\s*\\|d (.*?)\\|.*', '\1\2') AS result FROM marc WHERE id = '10825700016';
MySQL 实现
SELECT TRIM(TRAILING ' ' FROM REGEXP_SUBSTR(tag, '\\|a (.*?)\\|d', 1, 1, 's', 1)) || REGEXP_SUBSTR(tag, '\\|d (.*?)\\|', 1, 1, 's', 1) AS result FROM marc WHERE id = '10825700016';
原语句问题说明
你之前使用的正则(.*)_[^|][^a][^d]*$完全不符合目标文本的结构:既没有定位到|a和|d的标记位,也没有匹配到需要提取的内容区间,因此无法得到预期结果。
内容的提问来源于stack exchange,提问作者franco
相关产品推荐
相关产品推荐

