如何在PostgreSQL中提取到cardSlot部分的左侧字符串
PostgreSQL 提取字符串至cardSlot编号段的通用查询方法
需求明确:需要从eq1.sources列的字符串中,提取从开头到cardSlot-<编号>为止的部分,无论后续是否有:card或:card:daughterCard...这类后缀。
方法1:正则表达式匹配(最简洁)
利用PostgreSQL的正则表达式substring函数,直接匹配到cardSlot-后跟数字的结尾部分:
SELECT substring(eq1.sources FROM '^.*:cardSlot-\d+') AS extracted_source FROM eq1;
- 正则说明:
^匹配字符串开头.*匹配任意字符(尽可能多,确保覆盖到最后一个:前的内容):cardSlot-\d+匹配cardSlot-后跟至少一个数字的部分,这正是我们要保留的最后一段
方法2:拆分字符串后聚合(更直观,适合复杂结构扩展)
如果需要更灵活的处理,可以先将字符串按:拆分,找到包含cardSlot的分段位置,再将前面的分段重新拼接:
SELECT string_agg(part, ':' ORDER BY idx) AS extracted_source FROM eq1, unnest(string_to_array(eq1.sources, ':')) WITH ORDINALITY AS parts(part, idx) WHERE idx <= (SELECT idx FROM parts WHERE part LIKE 'cardSlot-%') GROUP BY eq1.sources;
- 步骤说明:
string_to_array把原字符串按:拆分成数组unnest...WITH ORDINALITY将数组转为带索引的行- 子查询找到
cardSlot-所在的分段索引 string_agg将索引小于等于目标索引的分段重新用:拼接
这两种方法都能适配所有给定的情况,无需依赖特定的后缀字符串。
内容的提问来源于stack exchange,提问作者Premvardhan Chanda
相关产品推荐
相关产品推荐

