如何在PostgreSQL中将指定文本解析为text[]类型数组?
如何在PostgreSQL中将指定文本解析为text[]类型数组?
嗨,我来帮你搞定这个问题~你之前用STRING_TO_ARRAY加REPLACE的方法之所以会多一个空元素,是因为替换掉所有<foo>之后,字符串最后会留下一个</foo>,拆分的时候自然就多出了一个空字符串元素。
给你推荐两种更靠谱的解决方案:
方法一:用正则匹配提取内容再聚合(最稳妥)
这种方法直接精准提取每个<foo>标签里的内容,再聚合成数组,完全不会产生多余元素:
SELECT array_agg(match) AS result FROM regexp_matches('<foo>a</foo><foo>b</foo><foo>c</foo><foo>d</foo>', '<foo>(.*?)</foo>', 'g') AS matches(match);
这里的关键点:
'g'参数表示全局匹配,会找出所有符合<foo>(.*?)</foo>模式的内容.*?是非贪婪匹配,确保每个标签内的内容独立提取,不会出现跨标签匹配的情况array_agg()把所有匹配到的单个值聚合成text[]类型的数组
方法二:优化原有方法(适合格式固定的场景)
如果你确定输入的文本格式固定,最后一定是以</foo>结尾,可以先把结尾的</foo>去掉再拆分:
SELECT string_to_array( rtrim(REPLACE('<foo>a</foo><foo>b</foo><foo>c</foo><foo>d</foo>', '<foo>', ''), '</foo>'), '</foo>' );
不过这种方法依赖输入格式的严格性,如果文本结尾有其他内容就会失效,不如第一种方法通用。
两种方法都能得到你想要的结果:{'a', 'b', 'c', 'd'},推荐优先用第一种正则匹配的方式,适配性更强~
备注:内容来源于stack exchange,提问作者hubigabi
相关产品推荐
相关产品推荐

